2009-07-13 24 views
3

J'écris un programme en C++ pour convertir une image BMP en JPEG.Besoin d'aide sur la conversion BMP en JPEG

est ici l'algorithme de base que je suis en train de suivre:

  1. Convertir l'espace couleur RVB à Y, Cb, Cr ..
  2. échantillon Cb Down et Cr par 2 (cela signifie que pour chaque bloc carré Appliquer la DCT aux unités de données de chaque 8 * 8 pixels ...
  3. Puis appliquer la quantification sur le coefficient DCT en utilisant le tableau de quantification standard de Cb. et Cr
  4. Do zigzag commander.
  5. Coder les coefficients DC et AC séparément en utilisant le codage de Huffman.
  6. Ecrire en-tête approprié et d'écrire la valeur codée huffman au fichier ...

J'ai vérifié que je fais correctement le dessus, mais je vais avoir encore les questions suivantes:

  • Le fichier JPEG en cours de génération ne s'affiche pas correctement.
  • J'ai fait un petit fichier bmp 8 * 8 24 bits (profondeur de couleur) complètement rempli avec la valeur de couleur R = 10 B = 10 et G = 100 ... tous les 64 pixels sont de la même couleur ..
  • Les données que je veux dire chaque étape est la suivante ...
    • la taille de l'en-tête de BMP 40
    • taille
    • de tête 40
    • largeur 8
    • hauteur 8
    • pas de plans 1
    • pas de bits par pixel 24
    • taille de l'image 194
    • pixel x de résolution par mètre 2834
    • pixel y de résolution par mètre 2834
    • pas de couleurs 0
    • pas de couleurs imp 0
    • Le Y Cb Cr conversion de (R, B, G) = (10,10,100) est (62, -29, -37)

Alors considérons Y Compo nent d'abord.

Le coefficient DCT pour le composant Y est:

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 

après quantification, le zig zag commande de l'unité de données unique que je suis en train est ceci, pour la composante 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 

Maintenant, le codage de Huffman de la matrice d'ordre au-dessus de zig zag est:

  • Y codant dc: 00111110
  • Y codage AC: 1010 (pour la table de Huffman en courant alternatif (luminance Y) la valeur de EOB est 1010)
  • codage de Huffman similairement des composantes Cb et Cr est la suivante:
  • cb codant dc: 11000010
  • codant ac cb: 01 (pour souffler de courant alternatif table de l'homme (Cb chrominance, Cr) valeur EOB est 01)
  • cr codage cc: 110101110
  • codage
  • cr ca: 01
  • Le code final Huffman que je reçois est:

    001111101010110000100111010111001 Longueur 33

donc pour le rendre divisible par 8, le remplissage de 1 est fait.

0011111010101100001001110101110011111111 Length 40. 

Ici, chaque simple 0 ou 1 est en fait un peu qui doit être stocké comme dans le fichier JPEG mais étant donné que nous ne pouvons pas écrire peu à peu dans le fichier, un total de 8 bits sont prises et converti en une valeur entière dans la base 10 et stocké dans un caractère de 1 octet.

Quelqu'un peut-il offrir des suggestions sur où je vais mal?

+2

Vous semblez avoir besoin d'aide pour composer un post et choisir les tags appropriés. –

+0

Enfin une excellente question technique. Merci Mark. Malheureusement, je n'ai pas la réponse, mais j'espère que quelqu'un le fera. – caskey

+1

Incidemment, distiller votre code à l'exemple le plus court que d'autres peuvent compiler peut faire des merveilles. Fournir du code est aussi un moyen beaucoup plus efficace d'aider les autres à voir ce qui pourrait manquer. –

Répondre

2

La première chose à faire pour résoudre votre problème est d'obtenir le livre Pennebaker/Mitchel sur la norme JPEG.

L'ordre des opérations est:

1) conversion Colorspace 2) FDCT 3) Quantification 4) Zigzag Réorganiser 5) Huffman encoder

Ces opérations ont beaucoup de difficultés en raison des nombreuses règles tu dois suivre. A) Traitez-vous correctement les prédicteurs DC? b) Encodez-vous correctement les composants A/C? les courses de zéros? c) Respectez-vous la règle du flux de sortie concernant les «zéros et les zéros»? d) Votre formule de conversion d'espace de couleur est-elle correcte? Inclut-il le 0x80 qui doit être soustrait de chacun des composants? e) Encodez-vous les blocs MCU dans l'ordre approprié en fonction de votre choix d'option de sous-échantillonnage?

-1

Ne pas réinventer la roue. Utilisez ImageMagick, Magick ++ ou CImg pour accomplir ceci.