PicScrub logoPicScrub
Volver a los formatos

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

Signature
IHDR
Metadata
IDAT
IEND
Signature
8 bytes
89 50 4E 47 0D 0A 1A 0A
IHDR
25 bytes
Cabecera de la imagen (obligatoria)
Metadata
100 bytes
Chunks tEXt, iTXt y eXIf
IDAT
Longitud variable
Datos comprimidos de la imagen
IEND
12 bytes
Marcador de fin de imagen

Firma PNG e IHDR

Firma PNG
Longitud de IHDR (13)
Tipo IHDR
Ancho (256)
Alto (256)
Profundidad de bits, tipo de color, etc.
OffsetHexASCII
0000
89504E470D0A1A0A0000000D49484452
.PNG........IHDR
0010
00000100000001000802000000000000
.............

Estructura de un chunk

LongitudTipoDatosCRC32
4 bytes4 bytesVariable4 bytes

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.

Formato: palabra clave + nulo + texto

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.

Palabra clave XMP: XML:com.adobe.xmp\0

eXIf: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

1

Verificar la firma

Comprobar la firma PNG: 89 50 4E 47 0D 0A 1A 0A

2

Analizar los chunks

Leer la longitud y el tipo de cada chunk y validar su CRC

3

Filtrar los chunks de metadatos

Identificar y saltar los chunks tEXt, zTXt, iTXt, eXIf y tIME

4

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)