2009-07-13 1 views
3

Ich schreibe ein C++ - Programm, um ein BMP-Bild in ein JPEG zu konvertieren.Brauchen Sie Hilfe zu BMP zu JPEG-Konvertierung

Hier ist der grundlegende Algorithmus Ich versuche zu folgen:

  1. konvertieren RGB-Farbraum Y, Cb, Cr ..
  2. Down-Probe Cb und Cr von 2 (dh für jeden quadratischen Block bedeutet, von 2 * 2 gibt es 4 verschiedene Y-Werte, aber 1 Cb- und 1 Cr-Wert
  3. Wenden Sie DCT auf Dateneinheiten von jedem 8 * 8 Pixel an ...
  4. Wenden Sie dann Quantisierung auf DCT-Koeffizienten an, indem Sie Standardquantisierungstabelle von Cb verwenden und Cr.
  5. Do Zick-Zack Bestellung.
  6. Codieren Sie den DC- und AC-Koeffizienten separat mithilfe der Huffman-Codierung.
  7. Schreiben richtige Header und Huffman-codierten Wert in die Datei ...

Ich habe überprüft, schreiben, dass ich die oben richtig mache, aber ich bin immer noch die folgenden Probleme mit:

  • Das generierte JPEG wird nicht korrekt angezeigt.
  • Ich habe eine kleine 8 * 8 24 Bit (Farbtiefe) BMP-Datei komplett gefüllt mit Farbwert R = 10 B = 10 und G = 100 ... alle 64 Pixel sind von gleicher Farbe ..
  • Die Daten wie folgt, dass ich bin immer bei jedem Schritt ... ist
    • BMP Header-Größe von 40
    • Größe des Headers 40
    • Breite 8
    • Höhe 8
    • keine der Ebenen 1
    • Anzahl der Bits pro Pixel 24
    • Bildgröße 194
    • x Auflösung Pixel pro Meter 2834
    • y Auflösung Pixel pro Meter 2834
    • keine der Farben 0
    • keine von imp Farben 0
    • The Y Cb Cr Umwandlung von (R, B, G) = (10,10,100) (62, -29, -37)

sie also Y Kompo betrachten Nent zuerst.

Das DCT-Koeffizient für die Y-Komponente ist:

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 

Nach der Quantisierung der Zick-Zack-Anordnung der einzelnen Dateneinheit, die ich habe, ist dies immer, für die Y-Komponente.

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 

Nun ist die Huffman-Codierung von oben zickzack Ordnung Array ist:

  • Y dc Codierung: 00111110
  • Y AC-Codierung: 1010 (für AC-Huffman-Tabelle (Luminanz Y) EOB-Wert 1010)
  • Similary Huffman-Codierung von Cb und Cr-Komponenten ist wie folgt:
  • cb dc Codierung: 11000010
  • cb ac Codierung: 01 (ac für Huff Mann Tabelle (Chrominanz Cb, Cr) EOB-Wert 01)
  • cr dc Codierung: 110101110
  • cr ac Codierung: 01
  • Der letzte Huffman-Code, die ich bekommen ist:

    001111101010110000100111010111001 Länge 33

so, um es durch 8 teilbar zu machen, ist Padding von 1 getan.

0011111010101100001001110101110011111111 Length 40. 

Hier wird jedes einzelne 0 oder 1 ist eigentlich ein bisschen, die gespeichert werden muss, wie es in der JPEG-Datei ist aber da wir nicht bitweise in der Datei, insgesamt 8 Bits genommen schreiben und konvertiert in einen Integer-Wert in der Basis 10 und in einem 1-Byte-Zeichen gespeichert.

Kann mir jemand Vorschläge machen, wo ich falsch liege?

+2

Sie scheinen Hilfe beim Verfassen eines Beitrags und der Auswahl geeigneter Tags zu benötigen. –

+0

Endlich eine ausgezeichnete technische Frage. Danke, Mark. Leider habe ich keine Antwort, aber ich hoffe, dass es jemand tut. – caskey

+1

Übrigens kann das Brennen des Codes auf das kürzeste Beispiel, das andere kompilieren können, Wunder bewirken. Die Bereitstellung von Code ist auch eine viel effektivere Möglichkeit, anderen zu helfen, zu sehen, was möglicherweise fehlt. –

Antwort

2

Das erste, was Sie tun können, um Ihr Problem zu lösen, ist, das Pennebaker/Mitchel-Buch auf den JPEG-Standard zu setzen.

Die Reihenfolge der Vorgänge ist:

1) Farbraumkonvertierung 2) FDCT 3) Quantisieren 4) Zick-Zack-Neuordnungs 5) Huffman kodieren

Diese Operationen wegen der vielen Regeln viele Komplexitäten haben du musst folgen.

a) Behandeln Sie die DC-Prädiktoren richtig? b) Codieren Sie die A/C-Komponenten ordnungsgemäß w.r.t. die Läufe von Nullen? c) Berücksichtigen Sie die Ausgabe-Stream-Regel über "aufgefüllte Nullen" und Marker? d) Ist Ihre Farbraumkonvertierungsformel korrekt? Beinhaltet es die 0x80, die von jeder der Komponenten subtrahiert werden muss? e) Codieren Sie die MCU-Blöcke in der richtigen Reihenfolge basierend auf Ihrer Wahl der Subsampling-Option?

-1

Das Rad nicht neu erfinden. Verwenden Sie ImageMagick, Magick ++ oder CImg, um dies zu erreichen.

Verwandte Themen