2012-08-08 39 views
13

我正在使用不同版本的Windows测试一堆计算机上的JPEG解压缩。所有这些计算机都安装了.NET 4,我正在针对.NET 2和“任何CPU”平台目标进行编译。以下代码在不同的系统上产生不同的输出。JPEG解压缩在Windows体系结构中不一致

Bitmap bmp = (Bitmap)Image.FromFile("test.jpg"); 

long datasum = 0; 
for (int y = 0; y < bmp.Height; y++) 
    for (int x = 0; x < bmp.Width; x++) 
     datasum = datasum + bmp.GetPixel(x, y).R + bmp.GetPixel(x, y).G + bmp.GetPixel(x, y).B; 

Console.WriteLine(datasum); 

所有Win7 64位和WinXP 32位机器都会产生一个结果。所有的Win7 32位机器都会产生另一个结果。

任何想法为什么输出会有所不同?

+6

有何不同? JPEG是一种有损压缩。在重建过程中,您可能会在反转,颜色转换或去量化过程中遇到浮点差异。 – jcopenha 2012-08-08 20:53:18

+0

我用了很多黑色的512x512图片,结果是5590758和5591908。虽然差异很小,但我不明白为什么XP会匹配Win7-64而不是Win7-32​​。也许有文件或网站解释这种行为? – Jono 2012-08-08 21:06:36

+0

你真的好奇jpeg解压缩吗?还是在这里工作有一个更大的问题? – 2012-08-08 22:34:55

回答

1

它由gdiplus.dll实现。检查哪些版本实际上在不同的系统上加载,以及比特率。

有可能是浮点问题,MMX指令允许一台机器上,而不是其他。

+0

我在c:\ windows \ winsxs \中有许多版本的gdiplus.dll。我怎么知道要看哪一个?我会说,我确实在各台机器上检查了c:\ windows \ system32 \ gdi32.dll的版本。 Win7机器上的版本(32位和64位)都是相同的。 XP机器上的版本与Win7机器不匹配。这些差异并不反映我在原始问题中提出的意见。 – Jono 2012-08-09 13:46:01

+0

调试器,tlist,vmmap,进程管理器可以告诉。 – 2012-08-09 14:12:45

+0

对于gdi32.dll gdiplus.dll和WindowsCodecs.dll,win7 32和64位均使用6.1.7601版本。 Win XP使用gdi32.dll版本5.1.2600.5698,gidplus.dll版本5.2.6002.22791和WindowsCodecs.dll 6.0.6001.17009。 – Jono 2012-08-09 20:46:39

1

可以与this

尝试将useEmbeddedColorManagement参数设置为true。

+0

好主意。刚刚尝试过,但没有影响结果。 – Jono 2012-08-14 20:33:15

+0

你也试过“假”吗?这很有趣。 – theGD 2012-08-14 20:47:01

+0

顺便说一句,你可以尝试与位图一样吗?这样我们可以对这个问题更具体。另外,您的WinXP上安装了哪个服务包? – theGD 2012-08-14 20:56:05

0

我几乎不敢提出这一点,但如果你发现了什么或实现自己的JPEG解码器?去老学校&依靠基础设施来做只不过是给你一个字节流。

这将是一个重大的痛苦的事,但可以消除你所看到的不一致。

+0

它是一个好主意,我当然不会排除它。我仍然很好奇上述问题出在哪里。 – Jono 2012-08-31 13:26:37

+0

只需使用http://www.ijg.org/ – gpvos 2015-01-26 15:05:36

0

这不是你的答案,我只是过了一半的路。我觉得最好的解决方案是使用你自己的JPEG解码器,我发现源代码为:Mini Jpeg Decoder但它是在C++中,我将它部署到Win32 dll文件,你可以找到它here。我正在使用.net框架工作超过10个小时,但我没有成功!因为我对C++没有任何线索。

+0

提供的libjpeg只需使用http://www.ijg.org/提供的libjpeg即可 – gpvos 2015-01-26 15:05:16