martes, 25 de febrero de 2014

Formato PNG (2) Ejemplo práctico

por ThE InSpEcToR

Introducción

En la entrada anterior se hizo una breve descripción de la especificación PNG, ahora en esta entrada se hará un análisis sobre un archivo con este formato, teniendo en cuenta la información de la entrada anterior. Como ejemplo se utilizará un archivo 4x4 pixceles, en color indexado:




El cual al abrirle con un editor hexadecimal se pueden ver las secciones descritas anteriormente.



Datos hexadecimales
Descripción
89 50 4E 47
Firma del archivo PNG
0D 0A 1A 0A
CRC32 de la firma
00 00 00 0D
Longitud de la sección IHDR (13Bytes)
49 48 44 52
Nombre de la sección (IHDR)
00 00 00 04 00 00 00 04 02 03 00 00 00
Datos de la sección IHDR
D4 9F 76 ED
CRC32 de la sección IHDR
00 00 00 0C
Longitud de la sección PLTE (12Bytes)
50 4C 54 45
Nombre de la sección (PLTE)
00 00 FF FF 00 00 00 FF 00 FF FF FF
Datos de la sección (4 colores RGB)
57 3B 0D 57
CRC32 de la sección PLTE
00 00 00 10
Longitud de la sección IDAT (16Bytes)
49 44 41 54
Nombre de la sección (IDAT)
08 D7 63 08 65 58 C5 C0 C0 F0 1F 00 06 AC 01 FF
Datos de la sección IDAT Los cuales se encuentran comprimidos con algoritmo DEFLATE librería zlib.
F1 17 DE 41
CRC32 de la sección IEND
00 00 00 00
Longitud de la sección IEND (0Bytes)
49 45 4E 44
Nombre de la sección IEND
AE 42 60 82
CRC32 de la sección IEND

Datos de la sección IHDR

Datos
Descripción
00 00 00 04
Ancho de la imagen (4 pixceles)
00 00 00 04
Alto de la imagen (4 pixceles)
02
Color depth (bits por entrada)
03
Tipo de color (Color indexado)
00
Filtros utilizados (Filtros predefinidos)
00
Método de compresión (DEFLATE)
00
Método de interlineado (Ninguno)

Datos de la sección PLTE

Datos
Descripción
00 00 FF
Color azul indice 0
FF 00 00
Color rojo indice 1
00 FF 00
Color verde indice 2
FF FF FF
Color blanco indice 3

Datos de la sección IDAT

En primera medida vamos a descomprimir los datos de esta sección ya que como se describe en la sección IHDR se encuentran comprimidos con el algoritmo DEFLATE de la librería zlib.

Para ello podemos usar algo de código en python para obtener nuestros datos:



Ahora teniendo en cuenta que por cada linea se agrega 1Byte que contiene el código del filtro utilizado para esa linea y que para cada entrada se utilizan 2bits para almacenar el indice del color en la sección PLTE se tiene.

Cod. Filtro
Indices del color
0
1
1
1
1
0
2
2
2
2
0
0
0
0
0
0
3
3
3
3




No hay comentarios.:

Publicar un comentario