Hai bisogno di aiuto su BMP alla conversione JPEG

voti
3

Sto scrivendo un programma in C ++ per convertire un'immagine BMP in un JPEG.

Ecco l'algoritmo di base che sto cercando di seguire:

  1. Convertire spazio colore RGB a Y, Cb, Cr ..
  2. Giù Cb e Cr campione da 2 (cioè per ogni blocco quadrato di 2 * 2 è 4 diverso valore Y ma 1 Cb e Cr 1 Valore
  3. Applicare DCT per unità di dati di ogni 8 * 8 pixel ...
  4. Quindi applicare quantizzazione il coefficiente DCT, utilizzando la tabella di quantizzazione standard Cb e Cr.
  5. Fare l'ordinazione a zig-zag.
  6. Codificare il coefficiente DC e AC separatamente utilizzando la codifica Huffman.
  7. Scrivi intestazione corretta e scrivere Huffman valore codificato nel file ...

Ho verificato che sto facendo quanto sopra correttamente, ma sto ancora avendo i seguenti problemi:

  • Il JPEG viene generato non viene visualizzato correttamente.
  • Ho fatto un piccolo 8 * 8 24 bit BMP (profondità di colore) completamente riempito con valore di colore R = 10 B = 10 e G = 100 ... tutti i 64 pixel sono dello stesso colore ..
  • I dati che sto ottenendo ad ogni passo è la seguente ...
    • BMP dimensione dell'intestazione 40
    • dimensione di intestazione 40
    • larghezza 8
    • altezza 8
    • nessuna di piani 1
    • nessuna di bit per pixel 24
    • dimensioni immagine 194
    • risoluzione x pixel per metro 2834
    • pixel risoluzione y per metro 2834
    • nessuna di colori 0
    • nessuna di colori imp 0
    • La conversione Y Cb Cr di (R, B, G) = (10,10,100) è (62, -29, -37)

Quindi prendiamo in considerazione componente Y prima.

Il coefficiente DCT per la componente Y è:

 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

Dopo la quantizzazione, l'ordinamento zig zag di unità di dati singolo che sto ricevendo è questo, per la 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

Ora la codifica di Huffman di sopra gamma zig zag ordine è:

  • Y codifica dc: 00111110
  • Y codifica ac 1010 (per la tabella ac Huffman (luminanza Y) valore EOB è 1010)
  • Analogamente codifica di Huffman di componenti Cb e Cr è il seguente:
  • cb codifica dc: 11000010
  • cb codifica ac: 01 (per la tabella ac Huffman (crominanza Cb, Cr) valore EOB è 01)
  • cr codifica dc: 110101110
  • cr codifica AC: 01
  • Il codice finale Huffman che ottengo è:

    001111101010110000100111010111001 Lunghezza 33

in modo da renderlo divisibile per 8, imbottitura di 1 è fatto.

0011111010101100001001110101110011111111 Length 40.

Qui ogni singolo 0 o 1 è in realtà un bit che deve essere memorizzata come è nel file JPEG ma poiché non possiamo scrivere bit per bit in file, un totale di 8 bit sono presi e convertita in un valore intero della base 10 e memorizzati in un carattere 1 byte.

Chiunque può offrire qualche suggerimento su dove sto andando male?

È pubblicato 13/07/2009 alle 18:36
fonte dall'utente
In altre lingue...                            


2 risposte

voti
2

La prima cosa da fare per risolvere il problema è quello di ottenere il libro Pennebaker / Mitchel sullo standard JPEG.

L'ordine delle operazioni è la seguente:

1) Conversione Colorspace 2) FDCT 3) Quantizzazione 4) zigzag riordino 5) Huffman codificare

Tali operazioni hanno molte complessità a causa delle molte regole da seguire.

a) State gestendo i predittori DC correttamente? b) Stai codificando i componenti A / C WRT correttamente i percorsi di zeri? c) State rispettando la regola di flusso di uscita di "zeri" imbottiti e marcatori? d) è la vostra formula di conversione dello spazio colore corretto? Non include la 0x80 che deve essere sottratto da ciascuno dei componenti? e) Stai codificando i blocchi MCU nell'ordine corretto in base alla scelta dell'opzione sottocampionamento?

Risposto il 19/07/2009 a 22:27
fonte dall'utente

voti
-1

Non reinventare la ruota. Utilizzare ImageMagick, Magick ++, o CImg per raggiungere questo obiettivo.

Risposto il 19/07/2009 a 23:20
fonte dall'utente

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