9

我正在使用 .NET 框架(尝试 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 站点上找到示例图像

4

1 回答 1

2

我无法解释为什么会发生这种情况,但似乎Image终结器线程上对象的非确定性终结正在影响主线程上的图像编码。(Imageimplements 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
}

Note that I did find one further oddity: when running a 32-bit (x86) build on Windows 7 SP1 x64, the first two calls to Save returned different results, then every subsequent call to Save produced the same output as the second call. In order to make the test pass, I had to repeat the first two lines (before the loop) to force two saves before performing the equality checks.

于 2012-06-09T20:32:42.810 回答