【问题标题】:JPEG decompression inconsistent across Windows architectures跨 Windows 体系结构的 JPEG 解压缩不一致
【发布时间】:2012-08-06 01:19:03
【问题描述】:

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

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 位机器都会产生另一个结果。

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

【问题讨论】:

  • 有何不同? JPEG 是一种有损压缩。在重建期间,您可能会在逆 dct、颜色变换或去量化期间遇到浮点差异。
  • 我使用了一个 512x512 的图像,其中有很多黑色,我得到了 5590758 和 5591908 的结果。虽然差异很小,但我不明白为什么 XP 会匹配 Win7-64 而不是 Win7-32​​。也许有解释这种行为的文档或网站?
  • 你对jpeg解压真的那么好奇吗?还是这里有更大的问题在起作用?
  • 我正在开发一个科学应用程序,该应用程序需要跨平台对 JPEG 进行完全相同的解码。不幸的是,我的来源只提供 JPEG,而不是位图类型。
  • 我建议使用实用程序来转换格式并可能分发转换后的文件而不是 JPEG。您要求的一致性不是 JPEG 的合理要求。

标签: c# .net image-processing jpeg


【解决方案1】:

由 gdiplus.dll 实现。检查不同系统上实际加载了哪些版本,以及位数。

可能存在浮点问题,MMX 指令允许在一台机器上使用,而不是在另一台机器上。

【讨论】:

  • 我在 c:\windows\winsxs\ 中有许多不同版本的 gdiplus.dll。我怎么知道该看哪一个?我会说我确实检查了跨机器的 c:\windows\system32\gdi32.dll 的版本。 Win7 机器上的版本(32 位和 64 位)是相同的。 XP 机器上的版本与 Win7 机器上的版本不匹配。这些差异并不反映我在原始问题中的观察。
  • 调试器、tlist、vmmap、进程资源管理器可以分辨。
  • win7 32 和 64 位的 gdi32.dll gdiplus.dll 和 WindowsCodecs.dll 都使用 6.1.7601 版本。 Win XP 使用 gdi32.dll 版本 5.1.2600.5698、gidplus.dll 版本 5.2.6002.22791 和 WindowsCodecs.dll 6.0.6001.17009。
【解决方案2】:

可以关联到this。

尝试将 useEmbeddedColorManagement 参数设置为 true。

【讨论】:

  • 好主意。刚试了一下,不影响结果。
  • 顺便说一句,你能用位图试试吗?这样我们就可以更具体地解决问题。另外,您的 WinXP 上安装了哪个服务包?
  • 将 useEmbeddedColorManagement 设置为 true 或 false 不会影响结果。当我尝试使用位图文件而不是 Jpeg 文件时,总和在所有这些平台上都是一致的。
【解决方案3】:

我几乎不敢提出这个建议,但是如果您找到或实现自己的 jpeg 解码器怎么办?走老路,依靠基础设施只给你一个字节流。

这样做会很痛苦,但可以消除您看到的不一致。

【讨论】:

  • 这是个好主意,我当然不会排除它。我仍然很好奇上述问题究竟出在哪里。
【解决方案4】:

在所有机器上安装latest version of GDI+,然后重试。

另外,如果您决定自己实现,我发现 this sample 过去很有用。

【讨论】:

    【解决方案5】:

    这不是你的答案,我刚刚过了一半。

    我认为最好的解决方案是使用您自己的 JPEG 解码器,我找到了它的源代码:Mini Jpeg Decoder,但它是在 C++ 中,我将它部署到 Win32 dll 文件,你可以找到它here。我在 .net 框架中使用它已经超过 10 个小时,但我没有成功!因为我对c++一无所知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多