gpt4 book ai didi

.NET Image.Save方法在Windows 64位上产生不可重现的结果

转载 作者:行者123 更新时间:2023-12-04 08:49:50 26 4
gpt4 key购买 nike

我正在使用.NET Framework(尝试3.5和4.0)加载.TIFF文件并将其另存为.PNG。
我希望随后两次调用Save()方法(使用相同的TIFF文件)来生成相同的PNG文件。但是,生成的文件有时“不同”。

下面的C#代码显示了该问题:

Image sourceToConvert = Bitmap.FromFile("c:\\tmp\\F1.tif");
sourceToConvert.Save("c:\\tmp\\F1_gen.png", ImageFormat.Png);

for (int i = 0; i < 100; i++)
{
sourceToConvert = Bitmap.FromFile("c:\\tmp\\F1.tif");
sourceToConvert.Save("c:\\tmp\\F1_regen.png", ImageFormat.Png);

if (!CompareFileBytes("c:\\tmp\\F1_gen.png", "c:\\tmp\\F1_regen.png"))
MessageBox.Show("Diff" + i);
}

这将在Windows 64上的第8、32、33、73 114、155、196迭代中显示“Diff”,而在32位计算机上则不显示任何错误。
(我使用x86目标;对于x64目标,情况更糟:迭代12、13、14、15,...时的差异)

有没有一种方法可以从Save()获得可重现的结果?

可以在此 FTP site上找到样本图像

最佳答案

我无法解释为什么会发生这种情况,但是看来终结器线程上Image对象的不确定性终结正在影响主线程上的图像编码。 (Image实现IDisposable,因此您应在使用完它后对其进行调用Dispose,以确定性地对其进行清理;否则,它将在以后的任意时间完成。)

如果将您的示例代码更改为以下代码,则每次调用Save都会得到相同的结果:

using (Image sourceToConvert = Bitmap.FromFile("c:\\tmp\\F1.tif"))
sourceToConvert.Save("c:\\tmp\\F1_gen.png", ImageFormat.Png);

for (int i = 0; i < 100; i++)
{
using (Image sourceToConvert = Bitmap.FromFile("c:\\tmp\\F1.tif"))
sourceToConvert.Save("c:\\tmp\\F1_regen.png", ImageFormat.Png);

// files are the same
}

请注意,我确实发现了另一个奇怪之处:在Windows 7 SP1 x64上运行32位(x86)构建时,对 Save的前两个调用返回了不同的结果,然后对 Save的每个后续调用都产生了与第二个调用相同的输出。为了使测试通过,我必须在执行相等性检查之前重复前两行(在循环之前)以强制执行两次保存。

关于.NET Image.Save方法在Windows 64位上产生不可重现的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10586538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com