2012-08-08 20 views
13

異なるバージョンのWindowsを搭載した多数のコンピュータでJPEG解凍をテストしています。これらのコンピュータはすべて.NET 4がインストールされており、.NET 2と「Any CPU」プラットフォームのターゲットに対してコンパイルしています。次のコードは、異なるシステムで異なる出力を生成します。Windowsアーキテクチャ間でJPEG伸張が一貫していません

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は非可逆圧縮です。再構成中、inverse-dct、カラー変換、または逆量子化の間に浮動小数点の違いに遭遇する可能性があります。 – jcopenha

+0

私は512x512の画像を黒で多く使用しましたが、結果として5590758と5591908が表示されています。違いは小さいが、私はXPがWin7-64にはマッチするがWin7-32​​にはマッチしない理由を理解していない。おそらく、そのような行動を説明する文書やサイトがありますか? – Jono

+0

jpeg圧縮解除について本当に興味がありますか?それとももっと大きな問題がここにあるのですか? –

答えて

1

これはgdiplus.dllによって実装されています。どのバージョンが実際に異なるシステムにロードされているか、ビット数を確認してください。

浮動小数点の問題、MMX命令があるマシンで許可されている可能性があります。

+0

私はc:\ windows \ winsxs \にさまざまなバージョンの多くのgdiplus.dllを持っています。どのようなものを見るかをどのように知るのですか?私はマシン間でc:\ windows \ system32 \ gdi32.dllのバージョンを確認したと言います。 Win7マシンのバージョン(32ビットと64ビットの両方)は同じです。 XPマシンのバージョンがWin7マシンと一致しません。これらの違いは私の最初の質問での私の観察を反映していません。 – Jono

+0

デバッガ、tlist、vmmap、プロセスエクスプローラが伝えることができます。 –

+0

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を使用しています。 – Jono

1

thisに関連することがあります。

useEmbeddedColorManagementパラメータをtrueに設定してみてください。

+0

素晴らしいアイデア。ちょうど試しましたが、結果には影響しませんでした。 – Jono

+0

あなたは「偽」も試みましたか?それはストレスです。 – theGD

+0

Btw、ビットマップと同じことを試すことはできますか?問題をより具体的にすることができるように。また、どのサービスパックがWinXPにインストールされていますか? – theGD

0

私はこれを示唆するのが怖いですが、独自のjpegデコーダを見つけたり実装したりするとどうなりますか?古い学校に行く&は、インフラストラクチャに依存してバイトストリームを提供する以外に何もしません。

これは大きな苦痛になりますが、表示される不一致を解消できます。

+0

それは良いアイデアです、私は確かにそれを排除しません。私はまだ上記の問題がどこにあるのか不思議です。 – Jono

+0

http://www.ijg.org/からlibjpegを使用するだけです。 – gpvos

0

すべてのマシンにlatest version of GDI+をインストールしてもう一度試してください。

また、あなた自身を実装することを決めた場合、私は過去に有用だったthis sampleを見つけました。

0

これはあなたの答えではない、私はちょうど途中を過ぎた。

あなた自身のJPEGデコーダを使用しているのが最も良い解決策だと思います。Mini Jpeg Decoderですが、C++で、Win32のDLLファイルに展開しています。hereです。私は.NETフレームワークでそれを使用するために働いているのは10時間以上ですが、私は成功しませんでした!私はC++について何の手掛かりも得ていないからです。

+0

http://www.ijg.org/のlibjpegを使用してください。 – gpvos

関連する問題