Formato HEIC
High Efficiency Image Container
El contenedor ISOBMFF
Si alguna vez has trabajado con archivos de vídeo MP4, HEIC te resultará familiar. Apple eligió el ISO Base Media File Format (ISOBMFF) como contenedor de HEIC, así que comparte ADN con los formatos de vídeo más que con los formatos de imagen tradicionales como JPEG o PNG.
El formato se compone de "cajas" anidadas (boxes, también llamadas átomos) con códigos de tipo de cuatro caracteres. Es un diseño sorprendentemente elegante, que permite jerarquías de datos complejas sin dejar de ser relativamente fácil de analizar una vez entiendes lo básico.
Estructura de un archivo HEIC
Cabecera HEIC (caja ftyp)
| Offset | Hex | ASCII | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 000000186674797068656963 | ....ftypheic | |||||||||||
| 000C | 000000006D69663168656963 | ....mif1heic | |||||||||||
Estructura de una caja
Si el tamaño es 1, después del tipo va un tamaño extendido de 8 bytes. Si es 0, la caja llega hasta el final del archivo.
Las cajas principales
La jerarquía de cajas de un HEIC puede llegar a ser muy profunda. A diferencia de JPEG, donde los metadatos están en posiciones predecibles, HEIC los entierra varios niveles dentro de una estructura anidada. Así encajan las piezas principales.
ftyp:Tipo de archivo
Primera caja del archivo. Contiene la marca principal y las marcas compatibles. Es imprescindible para identificar el formato.
heic heix hevc hevx heim heis hevm hevs mif1 msf1meta:Contenedor de metadatos
Contiene todos los metadatos: la ubicación de los elementos, sus propiedades y sus asociaciones. Aquí es donde viven los datos EXIF/XMP.
meta (contenedor de metadatos) ├── hdlr (referencia al handler) ├── pitm (ID del elemento principal) ├── iloc (ubicación de los elementos → offsets dentro de mdat) │ └── entradas [item_id, offset, longitud] ├── iinf (info de los elementos → localiza el elemento 'Exif') │ └── entradas infe con los tipos de elemento ├── iprp (propiedades de los elementos) │ ├── ipco (contenedor de propiedades) │ │ ├── hvcC (configuración del descodificador HEVC) │ │ ├── ispe (dimensiones de la imagen) │ │ ├── colr (perfil ICC, offset+12) │ │ ├── Exif (EXIF en formato TIFF) │ │ └── pixi (información de píxel) │ └── ipma (asociaciones de propiedades) └── iref (referencias entre elementos)
mdat:Datos multimedia
Contiene los datos de imagen codificados en HEVC. La caja iloc del bloque meta indica los offsets dentro de mdat.
Los metadatos en HEIC
Si estás acostumbrado a los marcadores APP de JPEG, HEIC funciona de otra manera. En lugar de marcadores secuenciales al principio del archivo, los metadatos viven como "propiedades de elemento" dentro de la caja meta. Los datos EXIF siguen estando en el conocido formato TIFF, pero para encontrarlos hay que navegar antes por la jerarquía de cajas.
Propiedad EXIF
Se guarda en ipco (el contenedor de propiedades de elemento) con el tipo "Exif". Contiene datos EXIF estándar en formato TIFF, igual que en JPEG.
Propiedad XMP
Metadatos basados en XML, guardados como propiedad de tipo "mime" con el content-type "application/rdf+xml".
Perfil ICC
El perfil de color se guarda en una caja "colr" con el tipo "prof".
Por qué importan los offsets
La caja iloc contiene offsets de bytes exactos que apuntan dentro de mdat. Si cambia el tamaño de alguna caja (por ejemplo, al eliminar metadatos), hay que recalcular esos offsets o el archivo dejará de poder leerse.
Anonimización sin pérdida
Aquí es donde HEIC se complica. El formato se diseñó para almacenar vídeo e imagen de forma eficiente, no para manipular metadatos con comodidad.
El problema
La estructura de HEIC, basada en offsets, hace que eliminar bytes sea arriesgado. La caja iloc contiene offsets de bytes exactos que apuntan dentro de mdat. Si quitas aunque sea una sola caja, esos offsets dejan de ser válidos y la imagen ya no se abre.
El enfoque de la sobrescritura con ceros
En lugar de eliminar las cajas de metadatos, PicScrub sobrescribe su contenido con ceros y mantiene intactas la estructura y los tamaños de las cajas.
Después: [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]
¿Por qué sobrescribir con ceros?
- • Se mantiene la integridad del archivo:todos los offsets siguen siendo válidos
- • Sin recompresión:los datos de la imagen no se tocan
- • Metadatos destruidos:los ceros no contienen ninguna información
- • ¿Es reversible?:no, lo que se sobrescribe se pierde
Cómo procesa PicScrub los HEIC
Analizar la estructura de cajas
Recorrer recursivamente ftyp y meta e identificar todas las cajas
Localizar los metadatos
Encontrar las propiedades Exif y XMP dentro del contenedor ipco
Poner a cero el contenido
Sobrescribir con ceros el contenido de las cajas de metadatos
Conservar la estructura
Mantener sin cambios las cabeceras, los tamaños y todos los offsets de las cajas
Una nota sobre el tamaño del archivo
Como PicScrub sobrescribe con ceros en vez de eliminar, el archivo de salida ocupará lo mismo que el de entrada. El espacio de los metadatos se conserva, pero relleno de ceros.
HEIC frente a HEIF y AVIF
Los nombres confunden, así que vamos a aclararlo. HEIF es el formato contenedor, mientras que HEIC y AVIF describen qué códec se usa para comprimir la imagen dentro de ese contenedor.
| Formato | Contenedor | Códec | Se usa en |
|---|---|---|---|
| HEIC | HEIF | HEVC (H.265) | Dispositivos de Apple |
| HEIF | HEIF | Varios | Contenedor genérico |
| AVIF | HEIF | AV1 | Web (libre de regalías) |
Los tres usan la misma estructura de contenedor ISOBMFF/HEIF, así que el enfoque de PicScrub sirve para todos.