2012-08-08 10 views
13

Sto testando la decompressione JPEG su un gruppo di computer con diverse versioni di Windows. Tutti questi computer hanno installato .NET 4 e sto eseguendo la compilazione su .NET 2 e sul target della piattaforma "Any CPU". Il codice seguente produce output diversi su sistemi diversi.Decompressione JPEG incoerente attraverso architetture 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); 

Tutte le macchine Win7 a 64 bit e WinXP a 32 bit producono un risultato. E tutte le macchine Win7 a 32 bit producono un altro risultato.

Qualche idea sul perché l'output sarebbe diverso?

+6

Quanto diverso? JPEG è una compressione con perdita di dati. Durante la ricostruzione è possibile che si verifichino differenze a virgola mobile durante l'inverse-dct, la trasformazione del colore o la dequantizzazione. – jcopenha

+0

Ho usato un'immagine 512x512 con molto nero e sto ottenendo 5590758 e 5591908 per i risultati. Mentre la differenza è piccola non capisco perché XP dovrebbe corrispondere a Win7-64 ma non a Win7-32. Forse c'è un documento o un sito che spiega tale comportamento? – Jono

+0

Sei davvero così curioso di decompressione jpeg? O c'è un problema più grande al lavoro qui? –

risposta

1

È implementato da gdiplus.dll. Verifica quali versioni sono effettivamente caricate su sistemi diversi e bitness.

Potrebbe esserci un problema in virgola mobile, istruzioni MMX consentite su una macchina, non l'altra.

+0

Ho molti gdiplus.dll di varie versioni in c: \ windows \ winsxs \. Come faccio a sapere quale guardare? Devo dire che ho controllato le versioni di c: \ windows \ system32 \ gdi32.dll su macchine. La versione sulle macchine Win7 (sia a 32 che a 64 bit) è la stessa. La versione sulle macchine XP non corrisponde alle macchine Win7. Queste differenze non riflettono le mie osservazioni fatte nella mia domanda iniziale. – Jono

+0

debugger, tlist, vmmap, process explorer può dire. –

+0

Entrambi win7 32 e 64 bit utilizzano la versione 6.1.7601 per gdiplus.dll gdi32.dll e WindowsCodecs.dll. Win XP utilizza gdi32.dll versione 5.1.2600.5698, gidplus.dll versione 5.2.6002.22791 e WindowsCodecs.dll 6.0.6001.17009. – Jono

1

Può essere correlato a this.

Provare a impostare il parametro useEmbeddedColorManagement su true.

+0

Ottima idea. Ho appena provato, ma non ha influenzato i risultati. – Jono

+0

Anche tu hai provato "falso", immagino? È interessante. – theGD

+0

Btw, puoi provare lo stesso con una bitmap? In modo che possiamo essere più specifici riguardo al problema. Inoltre, quale service pack è installato su WinXP? – theGD

0

Ho quasi paura di suggerirlo, ma cosa succede se trovi o implementa il tuo decodificatore jpeg? Go old school & si basa sull'infrastruttura per non fare altro che darti un flusso di byte.

Sarebbe un grave problema, ma potrebbe eliminare le incongruenze che stai vedendo.

+0

È una buona idea e sicuramente non lo escluderei. Sono ancora curioso di sapere dove si trova esattamente il problema sopra. – Jono

+0

Basta usare libjpeg da http://www.ijg.org/ – gpvos

0

questa non è la vostra risposta, ho appena superato metà strada.

Penso che la soluzione migliore sia usare il proprio decodificatore JPEG, ho trovato il codice sorgente per questo: Mini Jpeg Decoder ma è in C++, lo distribuisco nel file DLL Win32, lo si può trovare here. sono oltre 10 ore che sto lavorando per usarlo nel framework .net, ma non sono stato un successo! perché non ho idea di C++.

+0

Basta usare libjpeg da http://www.ijg.org/ – gpvos