lunes, 24 de febrero de 2014

Formato PNG (I) Teoría

Por: ThE InSpEcToR

Introducción


El formato PNG es un formato gráfico de los muchos que existen con unas características particulares que hacen parte de lo que trata esta entrada en su introducción.
Los formatos gráficos son los que nos permiten almacenar imágenes en un medio de almacenamiento para poder ser visualizadas en cualquier momento. una imagen de ordenador se compone de una matriz de puntos llamados pixceles, los cuales guardan la información de color de cada punto que conforma la imagen. Ahora bien la forma como se almacenan estos pixceles es en lo que se diferencia un formato de otro. Existen formatos como el BMP descrito en una entrada anterior los cuales guardan la información RGB de cada picxel y a pesar de que conservan una calidad muy buena, este tipo de archivos pueden llegar a ser muy pesados, otros formatos permiten comprimir esa información reduciendo el tamaño del archivo, de estos formatos entre los mas populares se encuentran el formato PNG y el formato JPG. que se diferencian en que el primero permite obtener un compresión sin perdida de información gráfica, y el segundo obtiene una compresión con perdida de información gráfica, pero que sin embargo, puede llegar a ser muy poco perceptible.


Estructura del formato PNG


Un archivo PNG se compone de una firma que identifica el archivo la cual es 0x89504E47 traducido a texto plano como‰PNG, seguido de una serie de secciones que comienzan con la sección IHDR y terminan con la sección IEND, todas las sección poseen un estructura idéntica y es la que se describe a continuación:

Composición de una sección:


Longitud

Son 4Bytes que contienen la longitud de los datos de la sección (solo delos datos, no incluye los 4Bytes del tipo de sección ni los 4Bytes del CRC-32de la sección)

Tipo de sección

Son 4Bytes que contienen por convención caracteres de la A-Z en mayúsculas, o minúsculas.

Datos de sección

Contiene los datos de sección según su tipo y su longitud fue la descrita en el campo longitud.

CRC de la sección

Son 4Bytes que contienen el CRC32 de los Bytes contenidos en el tipo de sección y los datos de sección (no incluye el campo de la longitud).

Convenciones sobre el tipo de sección


Los 4Bytes que contiene el tipo de sección poseen un formato particular que utiliza el bit 5 de cada Byte para indicar las propiedades de esa sección, hablando de caracteres ASCII el bit 5 determina sila letra es mayúscula cuando se encuentra en 0b y minúscula cuando se encuentra en 1b:

Bit auxiliar: bit 5 del primer Byte
0 -> mayúscula = sección critica.
1 -> minúscula = sección auxiliar.

Bit privado: bit 5 del segundo Byte
0 -> mayúscula = seccion privada
1 -> minúscula = sección publica

Bit reservado: bit 5 del tercer Byte
0 -> mayúscula = (valor recomendado por la especificación PNG 1.1)

Bit safe-to-copy: bit 5 del cuarto Byte
0 -> mayúscula = Indica que la sección debe ser guardada frente a cualquier modificación que tenga el archivo
1 -> minúscula = Indica que la sección puede no ser gaurdada frente a una modificación que tenga el archivo.

Especificación de las secciones de un archivo PNG

Un archivo PNG, debe contar como mínimo con las siguientes secciones, IHDR, IDAT, IEND y dependiendo de la información contenida en la sección IHDR puede ser también de caracter obligatorio la utilización de la sección PLTE.

Sección IHDR


Contiene los datos de la cabecera de la imagen así:

Ancho 4Bytes
Alto 4Bytes
Bit depth 1Byte
Tipo de color 1Byte
Método de compresión 1Byte
Método de filtrado 1Byte
Método de interlineado 1Byte

Tanto ancho como alto, corresponden a las dimensiones de la imagen en pixceles.
Bit depth se refiere a la cantidad de bytes utilizados para almacenar cada color o entrada de paleta (no bits por pixel)
Tipo de color es un valor entero que describe como han de interpretarse los datos de la imagen
Método de compresión es un valor entero que indica el método de compresión utilizado en los datos de la imagen.(Actualmente solo puede ser 0 y se refiere al método de compresión deflate/inflate.
Método de filtrado es un valor entero que indica el método de filtrado utilizado por los datos antes de su compresión(Actualmente solo puede ser 0 y se refiere a un método que contiene 5 posibles filtrados por linea).
Método de interlineado es un valor entero que indica el método de interlineado utilizado para trasmitir los datos de la imagen. (Actualmente hay dos valores definidos para este campo 0 -> no interlineado o 1-> Interlineado Adam7)
Respecto a los valores Bit depth y tipo de color la siguiente tabla muestra las combinaciones posibles:

Tipo de color Valores bit depth Interpretación
0 1,2,4,8,16 Cada entrada es un valor en escala de grises
2 8,16 Cada entrada es una tripleta RGB
3 1,2,4,8 Cada entrada es una entrada de paleta. la sección PLTE debe estar presente
4 8,16 Cada entrada es un valor en escala de grises seguido por un valor alpha
6 8,16 Cada entrada es una entrada RGB seguido por un valor alpha

Respecto a los métodos de filtrado:
Es importante tener en cuenta que en la sección IHDR el byte del método de filtrado tiene un valor entero que indica un GRUPO de métodos de filtrado y que actualmente solo existe un grupo de estos métodos y son 5, es decir, en la sección IHDR el byte de filtrado actualmente siempre es 0 ya que es el único grupo definido por ahora, sin embargo, este grupo posee 5 tipos de filtros los cuales son aplicados a los bytes de la imagen no a los pixceles, se aplican por cada linea de la imagen y cuando un filtro se refiere a los bytes de la izquierda en el primer byte de la linea se debe tomar el valor 0.

Filtro tipo 0: None
Este filtro no realiza ninguna operación sobre los bytes de la imágen,simplemente agrega un 0 al inicio de cada línea y almacena los bytes tal cual.

Filtro tipo 1: Sub
Sub(x) = byte(x) - (byte(x-pixcel anterior))
Este filtro almacena la diferencia entre el byte actual con el byte anterior correspondiente en el anterior pixcel.

Filtro tipo 2: Up
Up(x) = byte(x) - (byte(x-pixcel superior))
Funciona similar al filtro 1: Sub con la diferencia que se usa el byte del pixcel superior como sustraendo.

Filtro tipo 3: Average
Average(x) = byte(x) - redondeoSuperior(byte(x-anterior) +byte(x-superior)/2)
Este filtro utiliza el promedio de dos pixceles consecutivos (izquierda y superior) para calcular el valor a almacenar.

Filtro tipo 4: Paeth
Este filtro utiliza una función que involucra los valores de 3 pixceles consecutivos (izquierda, superior y superior izquierda) para calcular el valora almacenar.

Sección PLTE


Esta sección puede contener entre 1 y 256 definiciones de colores en formato RBG, cada entrada es por tanto una serie como sigue:

Red(Rojo) 1byte 0->negro 255->Rojo
Green(Verde) 1byte 0->negro 255->Verde
Blue(Azul) 1byte 0->negro 255->Azul

La cantidad de colores que contiene la tabla sería entonces la longitud dela sección dividida en 3 y en caso del número que el resultado no fuese entero la tabla tendría un error.
Esta tabla es requerida cuando el archivo contenga color indexado. y el byte de tipo de color sea 3.

Sección IDAT


Esta sección contiene los datos de la imagen actual, los cuales se obtienen de:
  1. Toma los datos RGB de la imagen
  2. Filtrar los bytes de la imagen con los filtros actuales
  3. Comprimir los datos de la imagen usando algoritmo DEFLATE de la librería zlib.
Por tanto para obtener los datos de una sección IDAT se efectuaría el proceso inverso.
Ahora de este tipo de sección pueden haber varias en un solo archivo, no significa que el archivo contenga varias capas, se trata mas bien de que el archivo ha dividido la sección en varias de menor tamaño, lo cual se hace después de haber comprimido los datos, así que para descomprimirlos es necesario unir las secciones de este tipo para obtener el resultado esperado.

Sección IEND


Esta sección que debe ser siempre la última de un archivo PNG no contieneningún tipo de datos y por tanto su longitud es 0.

No hay comentarios.:

Publicar un comentario