PicScrub logoPicScrub
Volver a los formatos

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

ftyp
meta
mdat
ftyp
24 bytes
Tipo de archivo y marcas
meta
1000 bytes
Contenedor de metadatos
mdat
Longitud variable
Datos multimedia (HEVC)

Cabecera HEIC (caja ftyp)

Tamaño de la caja (24)
Tipo de caja (ftyp)
Marca principal (heic)
Versión menor
Compatible (mif1)
Compatible (heic)
OffsetHexASCII
0000
000000186674797068656963
....ftypheic
000C
000000006D69663168656963
....mif1heic

Estructura de una caja

TamañoTipoDatos
4 bytes (BE)4 bytesTamaño - 8

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.

Marcas compatibles: heic heix hevc hevx heim heis hevm hevs mif1 msf1

meta: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.

Antes:   [Exif][Datos GPS: 37.7749, -122.4194][Cámara: iPhone]
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

1

Analizar la estructura de cajas

Recorrer recursivamente ftyp y meta e identificar todas las cajas

2

Localizar los metadatos

Encontrar las propiedades Exif y XMP dentro del contenedor ipco

3

Poner a cero el contenido

Sobrescribir con ceros el contenido de las cajas de metadatos

4

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.

Entrada: 2,5 MB (con 50 KB de EXIF)
Salida: 2,5 MB (50 KB 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.

FormatoContenedorCódecSe usa en
HEICHEIFHEVC (H.265)Dispositivos de Apple
HEIFHEIFVariosContenedor genérico
AVIFHEIFAV1Web (libre de regalías)

Los tres usan la misma estructura de contenedor ISOBMFF/HEIF, así que el enfoque de PicScrub sirve para todos.