Necesita ayuda en la conversión de BMP a JPEG

votos
3

Estoy escribiendo un programa C ++ para convertir una imagen BMP a JPEG.

Este es el algoritmo básico que trato de seguir:

  1. Convierte espacio de color RGB a Y, Cb, Cr ..
  2. Abajo la muestra Cb y Cr por 2 (eso significa que para cada bloque cuadrado de 2 * 2 hay 4 valores diferentes de Y pero 1 Cb y 1 Cr
  3. Aplicar DCT a unidades de datos de cada 8 * 8 píxeles ...
  4. Luego aplique cuantización en el coeficiente DCT utilizando la tabla de cuantificación estándar de Cb y Cr.
  5. Haga un pedido en zigzag.
  6. Codifique el coeficiente DC y AC por separado utilizando la codificación huffman.
  7. Escriba el encabezado correcto y escriba el valor codificado de huffman en el archivo ...

He verificado que estoy haciendo lo anterior correctamente, pero sigo teniendo los siguientes problemas:

  • El JPEG que se está generando no se muestra correctamente.
  • Hice un pequeño archivo bmp de 8 * 8 24 bits (profundidad de color) completamente lleno con el valor de color R = 10 B = 10 y G = 100 ... los 64 píxeles son del mismo color.
  • Los datos que obtengo en cada paso son los siguientes ...
    • Tamaño de encabezado BMP de 40
    • tamaño del encabezado 40
    • ancho 8
    • altura 8
    • no de aviones 1
    • no de bits por píxel 24
    • tamaño de la imagen 194
    • x píxel de resolución por metro 2834
    • y resolución de píxel por metro 2834
    • no de colores 0
    • no de imp colores 0
    • La conversión de Y Cb Cr de (R, B, G) = (10,10,100) es (62, -29, -37)

Así que consideremos el componente Y primero.

El coeficiente DCT para el componente Y es:

 495 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0

Después de la Cuantización, el orden en zig zag de la unidad de datos única que obtengo es este, para el componente Y.

30 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0

Ahora la codificación de Huffman de la matriz de orden zig zag anterior es:

  • Codificación Y dc: 00111110
  • Codificación de Y ac: 1010 (para la tabla de huffman de CA (luminancia Y) El valor de EOB es 1010)
  • La codificación de Huffman de Similary de los componentes Cb y Cr es la siguiente:
  • código de cb dc: 11000010
  • cb ac coding: 01 (para la tabla de huffman de ac (crominancia Cb, Cr) El valor de EOB es 01)
  • codificación cr dc: 110101110
  • cr ac coding: 01
  • El código final de Huffman que obtengo es:

    001111101010110000100111010111001 Longitud 33

para que sea divisible por 8, se completa el relleno de 1.

0011111010101100001001110101110011111111 Length 40.

Aquí cada uno 0 o 1 es en realidad un poco que debe almacenarse como está en el archivo JPEG, pero como no podemos escribir bit a bit en un archivo, se toman un total de 8 bits y se convierten en un valor entero en la base 10 y almacenado en un carácter de 1 byte.

¿Alguien puede ofrecer alguna sugerencia sobre dónde me estoy equivocando?

Publicado el 13/07/2009 a las 18:36
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

Lo primero que debe hacer para resolver su problema es obtener el libro de Pennebaker / Mitchel en el estándar JPEG.

El orden de las operaciones es:

1) Conversión de espacio de colores 2) FDCT 3) Cuantizar 4) Reordenar zigzag 5) Codificar de Huffman

Esas operaciones tienen muchas complejidades debido a las muchas reglas que debe seguir.

a) ¿Está manejando los predictores DC correctamente? b) ¿Está codificando los componentes de A / C correctamente con las corridas de ceros? c) ¿Respetas la regla de flujo de salida sobre "ceros acolchados" y marcadores? d) ¿Es correcta la fórmula de conversión de espacio de color? ¿Incluye el 0x80 que se debe restar de cada uno de los componentes? e) ¿Está codificando los bloques de MCU en el orden correcto según la opción de submuestreo que elija?

Respondida el 19/07/2009 a las 22:27
fuente por usuario

votos
-1

No reinventar la rueda. Use ImageMagick, Magick ++ o CImg para lograr esto.

Respondida el 19/07/2009 a las 23:20
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more