System.Drawing.Image Save()产生不一致的文件大小

时间:2012-01-26 16:42:23

标签: image-processing windows-7 .net-4.0 system.drawing image-conversion

在将TIFF转换为PDF时,我注意到一些PDF已损坏。经过一些研究,看来问题出现在System.Drawing.Image类中。为了测试这一点,我没有转换为PDF,而是将程序读入图像文件并重新保存。一些新保存的文件在程序的不同运行之间具有不一致的文件大小。基本步骤是:

  1. 我将TIFF图像读入字节数组。
  2. 我使用System.Drawing.Image.FromStream()方法从字节数组创建一个图像对象。
  3. 然后我调用System.Drawing.Image.Save(stream)方法将图像保存到新流中。
  4. 然后我检查stream.ToArray()方法的长度。
  5. 相同的输入文件导致连续程序执行之间的输出长度不同。输出长度变化了几百个字节。另外,得到的输出长度是输入长度的两倍以上,但我认为这是由于压缩或缺少压​​缩。我在Windows 7 32位上使用.net 4运行它。

    为什么输出长度会像这样变化?

    更新:

    在查看此连接问题(https://connect.microsoft.com/VisualStudio/feedback/details/584681/system-drawing-image-flags-has-different-value-in-vista-and-windows-7)和此MSDN页面上的社区评论(http://msdn.microsoft.com/en-us/library/system.drawing.image.save.aspx)后,问题似乎与Windows 7中的操作系统级错误有关。任何人都可以确认这还是提供解决方法?

2 个答案:

答案 0 :(得分:1)

我在Windows 2008服务器上看到类似的问题,64位:加载相同的TIFF并再次保存将在不同的运行中生成不同的文件。因此,我不认为它是Windows 7特有的。我编写了以下C#程序来展示它:

for (int i = 0; i < 2000; i++)
            {

                sourceToConvert = Bitmap.FromFile("c:\\tmp\\png\\zip\\fig_AAAW_6.tif");
                sourceToConvert.Save("c:\\tmp\\png\\fig_AAAW_6_regen.png", ImageFormat.Png);

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

这将在64位计算机上的迭代8,32,33,73,114,155,196,...处显示“Diff”,而在使用x86目标CPU编译时,它会在32位计算机上生成完全相同的文件。当我使用64位目标时,情况变得更糟:文件在迭代12,13,14,15,...时不同...

答案 1 :(得分:0)

如我的更新中所述,在查看此连接问题(https://connect.microsoft.com/VisualStudio/feedback/details/584681/system-drawing-image-flags-has-different-value-in-vista-and-windows-7)和此MSDN页面上的社区评论(http://msdn.microsoft.com/en-us/library/system.drawing.image.save.aspx)后,问题似乎与操作系统级错误有关。 Windows 7。

此外,在Windows XP中读取图像时,图像对象上的flags属性设置为77888.在Win7上,它设置为77840.在查看标志属性的MSDN文档后{{3} }),区别在于WinXP将图像标记为灰度图像(我的是),但Win7将其标记为RGB图像。这似乎是问题的症状,但我对图像格式和色彩空间知之甚少,无法对此发表权威。