Formato PNG
Portable Network Graphics
Una estructura basada en chunks
PNG tiene uno de los formatos de archivo más limpios que existen. Todo se organiza en "chunks", bloques autónomos con un tipo, unos datos y una suma de comprobación. Lo elegante del asunto es que los descodificadores pueden saltarse los chunks que no entienden, y así PNG admite metadatos sin romper el software antiguo.
Lo ingenioso está en cómo se nombran los chunks: si la primera letra va en mayúscula, el chunk es "crítico" (sin él la imagen no se muestra). En minúscula significa "auxiliar", es decir, útil pero no imprescindible. Todos los chunks de metadatos que nos interesan son auxiliares, y por eso podemos eliminarlos sin riesgo.
Estructura de un archivo PNG
Firma PNG e IHDR
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 89504E470D0A1A0A0000000D49484452 | .PNG........IHDR | |||||||||||||||
| 0010 | 00000100000001000802000000000000 | ............. | |||||||||||||||
Estructura de un chunk
Convención de nombres de los chunks
- • Primera letra en mayúscula = chunk crítico (hay que saber interpretarlo)
- • Primera letra en minúscula = chunk auxiliar (opcional, se puede ignorar)
- • Segunda letra = público (mayúscula) o privado (minúscula)
Chunks críticos
Estos chunks tienen que estar presentes y ser interpretados para que la imagen sea válida. PicScrub conserva siempre los chunks críticos.
IHDR:Cabecera de la imagen
Primer chunk después de la firma. Contiene el ancho, el alto, la profundidad de bits, el tipo de color y los métodos de compresión, filtrado y entrelazado. Exactamente 13 bytes de datos.
IDAT:Datos de la imagen
Contiene los datos comprimidos de la imagen (zlib/deflate). Puede repartirse entre varios chunks IDAT, que deben ir siempre consecutivos.
IEND:Fin de la imagen
Marca el final del flujo de datos PNG. Debe ser el último chunk. No tiene bytes de datos.
PLTE:Paleta
Obligatorio en las imágenes de color indexado (tipo de color 3). Contiene entre 1 y 256 entradas de paleta RGB.
Chunks de metadatos
Chunks auxiliares que pueden contener metadatos sensibles para tu privacidad. Estos son los que elimina PicScrub.
tEXt:Texto sin comprimir
Pares clave-valor codificados en Latin-1. Claves habituales: Author, Description, Copyright, Creation Time y Software.
zTXt:Texto comprimido
Igual que tEXt, pero con compresión zlib. Se usa para textos más largos.
iTXt:Texto internacional
Texto UTF-8 con compresión opcional. Admite etiquetas de idioma y palabras clave traducidas. Es el que se usa para los metadatos XMP.
XML:com.adobe.xmp\0eXIf:Datos EXIF
Registrado como extensión de PNG en 2017. Contiene datos EXIF en bruto en formato TIFF, con la misma estructura que en JPEG. Puede incluir GPS, fecha y hora e información del dispositivo.
iCCP:Perfil de color ICC
Perfil de color ICC incrustado. Comprimido con zlib. PicScrub lo conserva por defecto para mantener la fidelidad del color.
tIME:Hora de la última modificación
Siete bytes: año (2), mes, día, hora, minuto y segundo. Revela cuándo se modificó la imagen por última vez.
Chunks relacionados con el color
Estos chunks afectan a cómo se representa el color, pero normalmente no contienen información personal. PicScrub los conserva por defecto.
sRGB
Indica el espacio de color sRGB. Un solo byte para el propósito de representación.
gAMA
Valor de gamma como entero sin signo de 4 bytes (multiplicado por 100 000).
cHRM
Cromaticidades primarias y coordenadas del punto blanco.
sBIT
Profundidad de bits original de cada canal.
Verificación CRC32
Todos los chunks de PNG incluyen una suma de comprobación CRC32 calculada sobre el tipo y los datos del chunk. Así se garantiza la integridad de los datos.
Cálculo del CRC
Entrada CRC32 = chunk_type (4 bytes) + chunk_data (N bytes) Salida CRC32 = 4 bytes añadidos tras los datos del chunk // PNG usa el polinomio CRC-32: 0xEDB88320
Por qué PicScrub valida el CRC
Al leer archivos PNG, PicScrub valida el CRC de cada chunk para garantizar la integridad de los datos. Los chunks dañados se gestionan sin romper el proceso.
Cómo procesa PicScrub los PNG
Verificar la firma
Comprobar la firma PNG: 89 50 4E 47 0D 0A 1A 0A
Analizar los chunks
Leer la longitud y el tipo de cada chunk y validar su CRC
Filtrar los chunks de metadatos
Identificar y saltar los chunks tEXt, zTXt, iTXt, eXIf y tIME
Reconstruir el archivo
Escribir la firma + los chunks filtrados + IEND
Chunks conservados
- • IHDR, PLTE, IDAT, IEND (críticos)
- • sRGB, gAMA, cHRM (color)
- • iCCP (perfil de color, opcional)
- • pHYs (dimensiones del píxel)
- • tRNS (transparencia)
Chunks eliminados
- • tEXt (metadatos de texto)
- • zTXt (texto comprimido)
- • iTXt (texto internacional, XMP)
- • eXIf (datos EXIF)
- • tIME (hora de modificación)