Besoin d'aide sur BMP à la conversion JPEG

voix
3

J'écris un programme C ++ pour convertir une image BMP en JPEG.

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

  1. Convertir l'espace de couleur RVB à Y, Cb, Cr ..
  2. Bas échantillon Cb et Cr par deux (ce qui signifie pour chaque bloc carré de 2 * 2 il y a quatre différentes valeurs Y, mais une Cb et une valeur de Cr
  3. Appliquer TCD aux unités de données de chaque 8 * 8 pixels ...
  4. Ensuite, appliquez une quantification sur le coefficient DCT en utilisant la table de quantification standard Cb et Cr.
  5. Faites la commande en zigzag.
  6. Coder le coefficient DC et AC séparément en utilisant un codage de Huffman.
  7. Ecrire en-tête approprié et écrire la valeur codée huffman au fichier ...

Je l'ai vérifié que je fais le bien au-dessus, mais je vais avoir encore les questions suivantes:

  • Le JPEG généré est pas affiché correctement.
  • Je fait un petit 8 * 8 24 bits (nombre de couleurs) fichier BMP 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 reçois à chaque étape est la suivante ...
    • taille d'en-tête BMP de 40
    • la taille de la tête 40
    • largeur 8
    • hauteur 8
    • pas de plans 1
    • pas de bits par pixel 24
    • taille de l'image 194
    • x pixel de résolution par mètre 2834
    • y pixel de résolution par mètre 2834
    • pas de couleurs 0
    • pas de couleurs 0 diablotin
    • La conversion Cr Cb Y de (R, B, G) = (10,10,100) est (62, -29, -37)

Donc, considérons le composant Y en premier.

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 reçois est-ce, 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 zig zag ci-dessus est la suivante:

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

    001111101010110000100111010111001 Longueur 33

de manière à rendre divisible par 8, le rembourrage de 1 est effectuée.

0011111010101100001001110101110011111111 Length 40.

Ici, chaque seule 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 pris et transformé en une valeur entière dans la base 10 et stocké dans un caractère de 1 octet.

Quelqu'un peut-il proposer des suggestions sur l'endroit où je vais mal?

Créé 13/07/2009 à 18:36
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
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) la conversion Colorspace 2) FDCT 3) Quantification 4) Zigzag réordonnancement 5) de codage Huffman

Ces opérations ont beaucoup de difficultés en raison des nombreuses règles que vous devez suivre.

a) Vous gérez les prédicteurs DC correctement? b) Vous codez les composants A / C correctement par rapport'a les séries de zéros? c) Est-ce que vous respectez la règle de flux de sortie sur les « zéros » et rembourrées marqueurs? d) est votre formule de conversion colorspace correcte? Cela inclut-il le 0x80 qui doit être soustrait de chacun des composants? e) Vous encodez les blocs de MCU dans l'ordre approprié en fonction de votre choix de l'option sous-échantillonnage?

Créé 19/07/2009 à 22:27
source utilisateur

voix
-1

Ne pas réinventer la roue. Utilisez ImageMagick, Magick ++ ou CImg d'y arriver.

Créé 19/07/2009 à 23:20
source utilisateur

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