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:
- Convertir l'espace couleur RVB à Y, Cb, Cr ..
- é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 ...
- Puis appliquer la quantification sur le coefficient DCT en utilisant le tableau de quantification standard de Cb. et Cr
- Do zigzag commander.
- Coder les coefficients DC et AC séparément en utilisant le codage de Huffman.
- 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?
Vous semblez avoir besoin d'aide pour composer un post et choisir les tags appropriés. –
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
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. –