2011-07-21 20 views
8

Estoy tratando de escribir un codificador y decodificador JPEG/JFIF desde cero usando C. Experimenté escribiendo un archivo JPEG de muestra, pero parece que no puedo abrirlo usando MS paint, Firefox. Pero puedo decodificarlo usando JPEGsnoop (http://www.impulseadventure.com/photo/jpeg-snoop.html?ver=1.5.2) y http://nothings.org/stb_image.c. Creo que el archivo JPEG de muestra cumple con el estándar JPEG/JFIF, no sé por qué aplicaciones como MS paint y Firefox no pueden abrirlo.formato de archivo jpeg pregunta

Así es como la muestra JPEG se parece a:

 

    SOI 
     APP0 segment 
     DQT segment (contains two quantization tables) 
     COM segment 
     SOF0 segment 
     DHT segment (contains four Huffman tables) 
     SOS segment 
     huffman encoded data 
    EOI 

El archivo JPEG muestra tiene tres componentes Y Cb Cr. Sin submuestreo para el componente Cb Cr. Las dos tablas de cuantificación están todas llenas. Las cuatro tablas de Huffman en el segmento de DHT son todos idénticos, parece que este

 

     [0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0] 
     [0,1,2, ... , 254] 

Eso significa que todos los códigos son 8 bits, por lo que la codificación Huffman en realidad no comprimir los datos.

Los datos codificados Huffman este aspecto:

 

     [0x0000(DC) 0x0000(AC)](Y) 
     [0x0000(DC) 0x0000(AC)](Cb) 
     [0x0000(DC) 0x0000(AC)](Cr) for all (i, j) MCUs except (10, 10) 

     the data in (10, 10) MCU: 
     [0x0008(DC) 0x0000(DC), 0x0000(AC)](Y) 
     [0x0000(DC) 0x0000(AC)](Cb) 
     [0x0000(DC) 0x0000(AC)](Cr) 

Puede alguien decirme lo que está mal con este archivo JPEG muestra? Gracias.

Aquí hay un enlace para el archivo de ejemplo JPEG (ha.jpg) http://www.guoxiaoyong.net/ha.jpg

+1

Podría dar un enlace a un archivo de ejemplo? –

+0

¿por qué el cierre? El póster ha trabajado mucho, hizo la pregunta claramente y explicó lo que están haciendo. –

Respuesta

4

que tuve hace años problemas similares con algo de código PNG (aunque no he escrito desde cero). Resultó que mi código era más compatible con las normas que las bibliotecas de Windows, algunos navegadores, etc. Funcionaban bien en casos típicos, pero se atascaban en imágenes inusuales y artificiales, incluso si estaban completamente en línea con el estándar. Una forma común de confundirlos era usar un ancho de píxel impar para la imagen. Casi la mitad de mi suite de prueba no era visible con Windows. (Esto fue hace muchas versiones, como Windows 95. Los códecs de Windows han mejorado sustancialmente.)

Terminé construyendo la biblioteca PNG de código abierto y usándola como mi implementación de referencia. Siempre que las imágenes que produjo mi código pudieran ser analizadas por la implementación de referencia y viceversa, lo llamé bueno. También verifiqué que mi código pudiera mostrar cualquier imagen que Windows pudiera mostrar. Cada vez que encontré un error, agregué la imagen a mi suite de prueba antes de arreglarla. Eso fue lo suficientemente bueno para mi proyecto.

Podría hacer lo mismo. Creo que hay una biblioteca JPEG de código abierto que se usa ampliamente como una implementación de referencia.

Si realmente quieres descubrir por qué Firefox (o lo que sea) no puede abrir tu imagen, puedes intentar comenzar con una imagen que se abre en Firefox. Haga pequeños cambios de forma incremental (por ejemplo, con un editor hexadecimal) para que se parezca más a la imagen que falla. Eso podría ayudarlo a reducir qué aspecto de su imagen está tropezando con la aplicación. Es cierto que algunos de esos pasos pueden ser difíciles de probar.

0

Creo que su archivo está muy codificado de forma no convencional. Sugeriría que encuentres un archivo de referencia y trates de imitar esa estructura. Además, usaría las tablas de muestra del estándar. Sus datos de Huffman están llenos de ceros haciendo que cada valor de CC sea cero, seguido por y Fin de bloque.

Si mira en jpegsnoop, su imagen está en dos tonos pero debe ser homogénea. Supongo que no tiene suficientes datos para codificar la imagen con la resolución que ha especificado. Creo que muchos decodificadores supondrían que significa que su archivo está dañado.

0

Firefox, (y muchas otras aplicaciones AFAIK) se basa en la biblioteca de código abierto JPEG del Independent JPEG group.

Puede descargar la fuente para esto, y luego ver exactamente por qué y cuándo no le gusta su archivo.

Además, esto ahorraría que reinventar la rueda :-)

Cuestiones relacionadas