2012-06-19 8 views
11

Cercando di capire il formato PNG.Cercando di estrarre i valori dei pixel da una determinata immagine PNG

considerare questo PNG Image:

enter image description here

L'immagine è tratta dal here

In Hex Editor, sembra che questo:

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 80 00 00 00 44 08 02 00 00 00 
C6 25 AA 3E 00 00 00 C2 49 44 41 54 78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F 
B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE D8 7B 89 BB 52 8D 3B 87 FE 01 00 80 
00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 
00 00 08 00 00 01 00 20 00 00 00 D4 5E 6A 64 4B 94 F5 98 7C D1 F4 92 5C 5C 3E CF 9C 3F 
73 71 58 5F AF 8B 79 5B EE 96 B6 47 EB F1 EA D1 CE B6 E3 75 3B E6 B9 95 8D C7 CE 03 39 
C9 AF C6 33 93 7B 66 37 CF AB BF F9 C9 2F 08 80 00 00 10 00 00 02 00 40 00 00 08 00 00 
01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 8C 37 DB 
68 03 20 FB ED 96 65 00 00 00 00 49 45 4E 44 AE 42 60 82 

caratteri equivalenti:

‰PNG........IHDR...€...D.....Æ%ª>...ÂIDATx^íÔ..Ã[email protected]Ñ·4Ýÿÿo³tVê‰.l(sâª4I.‡ÖþØ{‰ 
»R.;‡þ..€[email protected] ....€[email protected] ...Ô^jdK”õ˜|Ñô’\\>Ïœ?sqX_¯ 
‹y[î–¶GëñêÑζãu;湕.ÇÎ.9ɯÆ3“{f7Ï«¿ùÉ/.€[email protected] ....€[email protected] ..Œ7Ûh. 
ûí–e....IEND®B`‚ 

Lo stesso è mostrato nelle seguenti Schermata del Editor HEX:

enter image description here

sto cercando di decodificare questa immagine per estrarre la parte di intestazione ed i valori dei pixel RGB. Ho letto su PNG e anche su here, e finora ho notato quanto segue su questa immagine:

Il chunk IHDR deve apparire PRIMO. Contiene:

Width:    4 bytes 
Height:    4 bytes 
Bit depth:   1 byte 
Color type:   1 byte 
Compression method: 1 byte 
Filter method:  1 byte 
Interlace method: 1 byte 

Sotto sto iniziando la lettura dei dati HEX in sequenza:

1- primi 8-byte: Questa è la firma a 8-Byte

89 50 4E 47 0D 0A 1A 0A 

Equivalentemente questo è:% PNG come si può vedere in HEX Editor

Un'immagine PNG valida deve contenere un IHDR pezzo, uno o più blocchi IDAT e un blocco IEND.

2- Chunk: Lunghezza

00 00 00 0D 

3-Chunk: Chunk Tipo

49 48 44 52 

Che è IHDR.

http://www.w3.org/TR/PNG-Chunks.html

4- Chunk: larghezza dell'immagine (in decimale 128)

00 00 00 80 

5- Chunk: Altezza dell'immagine (in decimale 68)

00 00 00 44 

6- Chunk: BIT DEPTH (1 byte)

08 

7- Chunk: Tipo Colore

02 

8- Metodo di compressione

00 

9- Metodo di filtraggio:

Metodo

10- interlacciato:

00 

11- Qual è i seguenti dati?

C6 25 AA 3E 00 00 00 C2

12-- IDAT

13- cosa fa questi dati (dopo IDAT):

78 5E ED D4 81 06 C3 30 14 40 D1 B7 34 DD FF FF 6F B3 74 56 EA 89 12 6C 28 73 E2 AA 34 49 03 87 D6 FE D8 7B 89 BB 52 8D 3B 87 FE 01 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 00 D4 5E 6A 64 4B 94 F5 98 7C D1 F4 92 5C 5C 3E CF 9C 3F 73 71 58 5F AF 8B 79 5B EE 96 B6 47 EB F1 EA D1 CE B6 E3 75 3B E6 B9 95 8D C7 CE 03 39 C9 AF C6 33 93 7B 66 37 CF AB BF F9 C9 2F 08 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 04 00 80 00 00 10 00 00 02 00 40 00 00 08 00 00 01 00 20 00 00 37 8C DB 68 03 20 FB DE 96 65 00 00 00 00

14- IEND:

49 45 4E 44

15- ultimi 4 byte

AE 42 60 82 

Cosa sono?

Qualcuno può aiutarmi a capire i punti 11, 13 e 15 sopra? E dove sono i valori di Pixel? L'immagine sta avendo (128 x 68 pixel)

Scopo di conoscere questi dettagli:

Una volta che so questi dettagli, ho genererà la mia immagine PNG a 16 bit. Ho già valori di pixel, quindi il mio compito sarebbe quello di introdurre intestazioni ecc.
Non so se esiste un software in grado di eseguire questo lavoro.

UPDATE

capisco subito a causa della compressione, non sarei in grado di individuare i valori dei pixel.

Mi è venuta l'idea di poter scrivere un file in OpenCV e salvarlo come png. Bene, ora la mia domanda diretta è: ho un file binario binario con valori di 16 bit di pixel in scala di grigi. Posso scrivere questo in OpenCV come PNG a 16 bit?

risposta

3

Sebbene possa essere interessante conoscere le immagini PNG e l'effettiva rappresentazione dell'immagine nel file, non è necessario conoscerle per generare un file PNG.

Si noti che PNG utilizza la compressione senza perdita di dati, il che significa che non si otterranno due byte per pixel.

È possibile generare l'immagine in un programma e inviarla in formato PNG utilizzando molte delle librerie disponibili. Ad esempio, è possibile creare un'immagine in OpenCV e quindi stamparla con imWrite. Uno dei parametri può renderlo in uscita su un PNG.


Se si dispone dei grigi scala valori dei pixel a 16 bit, quindi è possibile metterli in una Mat.

Poi la conversione, che a un IplImage: Converting cv::Mat to IplImage*

Poi si può produrre in un file.

+0

Mi sono appena accorto della compressione, quindi non avrei ottenuto i valori precisi di Pixel. Ma puoi dirmi dell'11 e del 15? – gpuguy

+0

Grazie, la tua risposta mi è molto utile. Lo testerò e quindi pubblicherò il risultato. – gpuguy

+3

+1 Ma non sono completamente d'accordo con "Hai appena perso tempo". L'apprendimento delle parti interne di PNG potrebbe non essere necessario per il tuo compito attuale, ma è comunque l'apprendimento. – leonbloy

3

Solo per completezza (risposta di eboix è proprio sul posto)

11- Qual è i seguenti dati?

C6 25 AA 3E 00 00 00 C2

Ogni blocco termina con CRC (4 byte), e inizia con 4 byte che indicano la sua lunghezza. Quindi, C6 25 AA 3E è il CRC del chunk precedente (IHDR) e 00 00 00 C2 (194) è la lunghezza del seguente blocco (IDAT).

Allo stesso modo, gli ultimi 4 byte sono il CRC del blocco IEND.

3

Non ho guardato troppo attentamente, ma dal guardare la struttura ...

Q11. C6 25 AA 3E = CRC32 00 00 00 C2 = Dimensione del blocco successivo

Q13. controlla le specifiche png a cui ti riferisci in precedenza, che assomigliano al pezzo IDAT che conosci già come la compressione si applica ad esso!

Q15. AE 42 60 82 = CRC32