2012-08-08 25 views
13

Estoy probando la descompresión de JPEG en un grupo de computadoras con diferentes versiones de Windows. Todas estas computadoras tienen instalado .NET 4 y estoy compilando contra .NET 2 y el objetivo de la plataforma "Cualquier CPU". El siguiente código produce resultados diferentes en diferentes sistemas.Descompresión de JPEG inconsistente en las arquitecturas de 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); 

Todas las máquinas Win7 de 64 bits y WinXP de 32 bits producen un resultado. Y todas las máquinas Win7 de 32 bits producen otro resultado.

¿Alguna idea de por qué la salida sería diferente?

+6

¿Cuán diferente? JPEG es una compresión con pérdida. Durante la reconstrucción, podría encontrarse con diferencias de punto flotante durante el dct inverso, la transformación de color o la descuantificación. – jcopenha

+0

Utilicé una imagen de 512x512 con mucho negro y obtengo los resultados de 5590758 y 5591908. Si bien la diferencia es pequeña, no entiendo por qué XP coincidiría con Win7-64, pero no con Win7-32. Tal vez hay un documento o sitio que explica tal comportamiento? – Jono

+0

¿De verdad eres tan curioso sobre la descompresión jpeg? ¿O hay un problema mayor en el trabajo aquí? –

Respuesta

1

Es implementado por gdiplus.dll. Compruebe qué versiones están realmente cargadas en un sistema diferente y bitness.

Puede haber un problema de coma flotante, las instrucciones MMX permitidas en una máquina, no en la otra.

+0

Tengo muchas gdiplus.dll de varias versiones en c: \ windows \ winsxs \. ¿Cómo sé cuál mirar? Diré que compré las versiones de c: \ windows \ system32 \ gdi32.dll en todas las máquinas. La versión en las máquinas Win7 (32 y 64 bits) es la misma. La versión en las máquinas XP no coincide con las máquinas Win7. Estas diferencias no reflejan mis observaciones hechas en mi pregunta original. – Jono

+0

debugger, tlist, vmmap, el explorador de procesos puede decir. –

+0

Ambos win7 32 y 64 bit están utilizando la versión 6.1.7601 para gdi32.dll gdiplus.dll y WindowsCodecs.dll. Win XP está utilizando gdi32.dll versión 5.1.2600.5698, gidplus.dll versión 5.2.6002.22791 y WindowsCodecs.dll 6.0.6001.17009. – Jono

1

Puede relacionarse con this.

Intente establecer el parámetro useEmbeddedColorManagement en verdadero.

+0

Gran idea. Lo intenté, pero no afectó los resultados. – Jono

+0

¿Has probado "falso" también, supongo? Eso es interesante. – theGD

+0

Por cierto, ¿puedes probar lo mismo con un mapa de bits? Para que podamos ser más específicos sobre el problema. Además, ¿qué service pack está instalado en su WinXP? – theGD

0

Tengo casi miedo de sugerir esto, pero ¿qué sucede si encuentra o implementa su propio decodificador jpeg? Vaya a la vieja escuela & confíe en la infraestructura para hacer nada más que darle una secuencia de bytes.

Sería un gran dolor hacerlo, pero podría eliminar las incoherencias que está viendo.

+0

Es una buena idea, y ciertamente no lo descartaría. Todavía tengo curiosidad sobre dónde exactamente se encuentra el problema anterior. – Jono

+0

Solo use libjpeg desde http://www.ijg.org/ – gpvos

0

esta no es su respuesta, acabo de pasar la mitad del camino.

Creo que la mejor solución es utilizar su propio decodificador JPEG, me encontré con código fuente para que: Mini Jpeg Decoder pero es en C++, que despliego al archivo DLL de Win32, se puede encontrar here. son más de 10 horas las que estoy trabajando para usar eso en .NET framework, ¡pero no tuve éxito! porque no tengo ninguna pista sobre C++.

+0

Solo use libjpeg desde http://www.ijg.org/ – gpvos

Cuestiones relacionadas