Attualmente sono nel mezzo della scrittura di una piccola libreria I/O immagine PNG per scopi di apprendimento. Il mio problema è il seguente:Cercando di comprendere zlib/deflate nei file PNG
Ho creato un piccolo PNG solo 2 per 2 pixel in dimensione e l'ho aperto in un editor esadecimale per studiarne il contenuto. Questa è l'immagine che ho creato usando GIMP e memorizzata con una compressione di "9".
(Si prega di notare che questa è un'immagine ingrandita dell'originale 2 immagine 2 pixel per;))
quindi credo che non compresso, questo sarebbe simile a questo in memoria:
00 00 00 FF 00 00 00 00 FF 00 FF 00
se memorizzato senza un canale alfa.
(l'ho dichiarato solo qui per chiarezza, so di compressione e non mi aspettavo di vedere questo modello di byte nel file).
ho estratto il pezzo IDAT e spogliato l'ID pezzo ("IDAT") e il valore CRC tailing e ottenuto questa sequenza di byte:
08 D7 05 C1 01 01 00 00 00 80 10 FF 4F 17 10 48 06 0F FE 02 FE
Ora i primi due byte 08 D7
contengono informazioni sul blocco codificato . E gli ultimi quattro byte 0F FE 02 FE
devono essere il checksum ADLER32.
Questo in ultima analisi, mi lascia con i seguenti byte:
05 C1 01 01 00 00 00 80 10 FF 4F 17 10 48 06
Scritto in rappresentazione binaria questi byte sono:
0000 0101 1100 0001 0000 0001 0000 0001
0000 0000 0000 0000 0000 0000 1000 0000
0001 0000 1111 1111 0100 1111 0001 0111
0001 0000 0100 1000 0000 0110
Per comprendere sgonfiare meglio ho cercato di "spacchettare" questa sequenza a mano a Almeno prima che lo capisca abbastanza bene da scrivere un piccolo strumento. Ma mi sono bloccato molto velocemente.
RFC 1951() afferma che ogni blocco codificato inizia con un'intestazione a tre bit. Un bit indica se questo è l'ultimo blocco e altri due blocchi che indicano il metodo di compressione. Dato che presumo che l'encoder abbia usato solo un blocco qui (ovvero che il primo blocco sia automaticamente l'ultimo) e abbia utilizzato un albero Huffmann non statico, sto cercando la sequenza di bit "101" ma non riesco a trovarla (e non trovo altre probabili intestazioni "100" o "110").
Anche la RFC dice che ci devono essere due a due valori di byte LEN e nLen memorizzare la lunghezza del blocco in cui nLen è il complemento a uno dei LEN ma ancora una volta non riesco a trovare quattro di questi byte che soddisfano questa condizione. Non avrò nemmeno la fortuna di trovare qualcosa che possa rappresentare i due alberi di Huffmann.
Ho letto le RFC 1951 e 1950 ("ZLIB Compressed Data Format Specification" nonché gli articoli di Wikipedia su zlib, DEFLATE, LZ77 e Huffman, oltre a numerosi articoli piccoli e piuttosto inutili sul Web e alcune risposte su Stack Overflow, ma nessuna mi potrebbe aiutare con la mia mancanza di comprensione.
sarei davvero grato per qualsiasi aiuto o suggerimento!
Grazie per la risposta. Hai ragione, non pensavo al bit che ordinava i byte. Sono a conoscenza dei filtri e ho incluso solo questo piccolo esempio per mostrare cosa mi aspetto alla fine dopo la decompressione e la rimozione dei filtri ;-) .. potrebbe anche aver lasciato questo frammento. –
Ora che abbiamo l'intestazione. Ho ragione che i seguenti zeri sono la rappresentazione del primo albero di huffmann? (BTW, sì, è un livello molto basso e certamente non lo farò di nuovo su un altro formato di immagine, ma voglio capire che cosa sta succedendo a questo livello almeno una volta ;-)). –
Se si desidera una spiegazione dettagliata, consiglio http://www.amazon.com/Compressed-Image-File-Formats-JPEG/dp/0201604434/ref=pd_sim_b_1?ie=UTF8&refRID=05VHZ02D8BR9MJCQNK3W – user3344003