2012-08-08 28 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