0

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

  1. 我将 TIFF 图像读入字节数组。
  2. 我使用 System.Drawing.Image.FromStream() 方法从字节数组创建图像对象。
  3. 然后我调用 System.Drawing.Image.Save(stream) 方法将图像保存到新流中。
  4. 然后我检查 stream.ToArray() 方法的长度。

相同的输入文件会导致连续程序执行之间的输出长度不同。输出长度变化几百字节。此外,生成的输出长度是输入长度的两倍多,但我认为这是由于压缩或缺乏压缩造成的。我在带有 .net 4 的 Windows 7 32 位上运行它。

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

更新:

在查看此连接问题 ( 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 中的操作系统级错误有关。任何人都可以确认这一点或提供解决方法吗?

4

2 回答 2

1

我在 64 位 Windows 2008 服务器上看到了类似的问题:加载相同的 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 次迭代时不同,...

.

于 2012-05-14T15:22:17.080 回答
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。在查看了 flags 属性的 MSDN 文档后 ( http://msdn.microsoft .com/en-us/library/system.drawing.image.flags.aspx),不同之处在于WinXP将图像标记为灰度图像(我的是),但Win7将其标记为RGB图像。这似乎是问题的症状,但我对图像格式和色彩空间的了解还不够,无法就此与权威人士交谈。

于 2012-02-01T15:06:30.570 回答