2012-06-19 21 views
11

Intentando comprender el formato PNG.Intentando extraer valores de píxeles de una imagen PNG determinada

consideran este PNG Image:

enter image description here

La imagen está tomada de here

En Hex Editor, que se parece a esto:

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 

caracteres equivalentes:

‰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 mismo se muestra en la siguiente captura de pantalla del editor hexadecimal:

enter image description here

Estoy tratando de realizar ingeniería inversa a esta imagen para extraer la parte de cabecera y los valores de los píxeles RGB. Leí acerca de PNG y también here, y hasta ahora he observado lo siguiente acerca de esta Imagen:

El fragmento IHDR debe aparecer PRIMERO. 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 

A continuación estoy empezando a leer los datos hexadecimales en secuencia:

1- Primero de 8 bytes: Esta es la firma de 8 bytes

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

Equivalentemente esto es:% PNG como se puede ver en el editor HEX

Una imagen PNG válida debe contener un IHDR fragmento, uno o más fragmentos IDAT y un fragmento IEND.

2- Chunk: Longitud

00 00 00 0D 

3-Chunk: Chunk Tipo

49 48 44 52 

Cuál es IHDR.

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

4- Chunk: ancho de la imagen (en decimal 128)

00 00 00 80 

5- Chunk: Altura de la imagen (en decimal 68)

00 00 00 44 

6- Trozo: BIT DEPTH (1 byte)

08 

7- Chunk: Tipo Color

02 

8- Método de compresión

00 

9- método de filtro:

Método

10- entrelazado:

00 

11- ¿Qué son los datos siguientes?

C6 25 AA 3E 00 00 00 C2

12-- IDAT

13- ¿qué es esto de datos (después de 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 8C 37 DB 68 03 20 FB ED 96 65 00 00 00 00

14- IEND:

49 45 4E 44

15- últimos 4 bytes

AE 42 60 82 

¿Qué es esto?

¿Puede ayudarme a entender, puntos 11, 13 y 15 arriba? ¿Y dónde están los valores de Pixel? La imagen está teniendo (128 x 68 píxeles)

fin de conocer estos detalles:

Una vez que sé estos detalles, que va a generar mi propia imagen PNG de 16 bits. Ya tengo valores de píxeles, por lo que mi trabajo sería introducir encabezados, etc.
No sé si hay software que pueda realizar este trabajo.

ACTUALIZACIÓN

entiendo ahora debido a la compresión, yo no sería capaz de localizar los valores de los píxeles.

me ocurrió la idea de que puedo escribir un archivo en OpenCV y guardarlo como PNG. Bueno, ahora mi pregunta directa es: Tengo un archivo binario que tiene valores de 16 bits en escala de grises. ¿Puedo escribir esto en OpenCV como PNG de 16 bits?

Respuesta

3

Aunque puede ser interesante saber qué son realmente las imágenes PNG y cómo se representa realmente la imagen en el archivo, no necesita saber esto para generar un archivo PNG.

Tenga en cuenta que PNG utiliza compresión sin pérdidas, lo que significa que no conseguirá dos bytes por píxel.

Puede generar su imagen en un programa y enviarla en formato PNG utilizando muchas de las bibliotecas que existen. Por ejemplo, puede hacer su imagen en OpenCV y luego generarla con imWrite. Uno de los parámetros puede hacer que salga a PNG.


Si usted tiene los valores de 16 bits de píxeles en escala de grises, a continuación, puede ponerlos en un Mat.

A continuación, convertir eso a un IplImage: Converting cv::Mat to IplImage*

A continuación, puede dar salida a un archivo.

+0

Me acabo de dar cuenta de la compresión, por lo que está bien, no obtendría los valores exactos de píxeles. ¿Pero me puedes decir acerca de 11 y 15? – gpuguy

+0

Gracias, su respuesta es muy útil para mí. Lo probaré y luego publicaré el resultado. – gpuguy

+3

+1 Pero no estoy totalmente de acuerdo con "Acabas de perder tu tiempo". El aprendizaje sobre las funciones internas de PNG puede no ser necesario para su tarea actual, pero de todos modos está aprendiendo. – leonbloy

3

simplemente para la corrección (la respuesta de eboix es justo en el lugar)

11- ¿Qué son los datos siguientes?

C6 25 AA 3E 00 00 00 C2

Cada fragmento termina con un CRC (4 bytes), y comienza con 4 bytes que indican a su longitud. Así, C6 25 AA 3E es el CRC de la porción anterior (IHDR) y 00 00 00 C2 (194) es la longitud del trozo siguiente (IDAT).

De la misma manera, los últimos 4 bytes es el CRC de la porción IEND.

3

que no se veía muy cuidado, pero al mirar la estructura ...

Q11. C6 25 AA 3E = CRC32 00 00 00 C2 = Tamaño del siguiente fragmento

Q13. verifique las especificaciones png a las que se refirió anteriormente que se parecen al fragmento IDAT ¡ya sabe la compresión que se le aplicó!

Q15. AE 42 60 82 = CRC32

Cuestiones relacionadas