Formato HEIC
High Efficiency Image Container
Il contenitore ISOBMFF
Se hai mai lavorato con i video MP4, l'HEIC ti sembrerà familiare. Apple ha scelto l'ISO Base Media File Format (ISOBMFF) come contenitore per l'HEIC, il che vuol dire che ha più DNA in comune con i formati video che con i formati immagine tradizionali come JPEG o PNG.
Il formato è fatto di "box" annidati (chiamati anche atom) con codici di tipo di 4 caratteri. È un disegno sorprendentemente elegante, che permette gerarchie di dati complesse restando tutto sommato facile da analizzare una volta capite le basi.
Struttura di un file HEIC
Intestazione HEIC (box ftyp)
| Offset | Hex | ASCII | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 000000186674797068656963 | ....ftypheic | |||||||||||
| 000C | 000000006D69663168656963 | ....mif1heic | |||||||||||
Struttura di un box
Se size = 1, dopo il tipo arriva una dimensione estesa di 8 byte. Se size = 0, il box arriva fino alla fine del file.
I box principali
La gerarchia dei box nei file HEIC può scendere parecchio in profondità. A differenza del JPEG, dove i metadati stanno a offset prevedibili, l'HEIC li sotterra sotto diversi livelli di struttura annidata. Ecco come si incastrano i pezzi principali.
ftyp:tipo di file
Primo box del file. Contiene il brand principale e quelli compatibili. Serve per riconoscere il formato.
heic heix hevc hevx heim heis hevm hevs mif1 msf1meta:contenitore dei metadati
Contiene tutti i metadati, comprese le posizioni degli item, le proprietà e le associazioni. È qui che stanno i dati EXIF/XMP.
meta (contenitore dei metadati) ├── hdlr (riferimento all'handler) ├── pitm (ID dell'item principale) ├── iloc (posizioni degli item → offset dentro mdat) │ └── voci [item_id, offset, lunghezza] ├── iinf (info sugli item → trova l'item 'Exif') │ └── voci infe con i tipi di item ├── iprp (proprietà degli item) │ ├── ipco (contenitore delle proprietà) │ │ ├── hvcC (configurazione del decoder HEVC) │ │ ├── ispe (dimensioni dell'immagine) │ │ ├── colr (profilo ICC, offset+12) │ │ ├── Exif (EXIF in formato TIFF) │ │ └── pixi (informazioni sui pixel) │ └── ipma (associazioni delle proprietà) └── iref (riferimenti tra item)
mdat:dati multimediali
Contiene i dati veri dell'immagine codificati in HEVC. Il box iloc dentro meta fornisce gli offset dentro mdat.
I metadati nell'HEIC
Se sei abituato ai marker APP del JPEG, l'HEIC fa le cose in modo diverso. Invece di marker in sequenza all'inizio del file, i metadati vivono come "proprietà degli item" dentro il box meta. I dati EXIF veri e propri sono ancora nel solito formato TIFF, ma per trovarli devi prima navigare la gerarchia dei box.
Proprietà EXIF
Salvata dentro ipco (il contenitore delle proprietà) con tipo "Exif". Contiene dati EXIF standard in formato TIFF, come nel JPEG.
Proprietà XMP
Metadati basati su XML, salvati come proprietà di tipo "mime" con content-type "application/rdf+xml".
Profilo ICC
Profilo colore salvato come box "colr" di tipo "prof".
Perché gli offset contano
Il box iloc contiene offset di byte precisi che puntano dentro mdat. Se cambia la dimensione di un box qualsiasi (per esempio rimuovendo dei metadati), quegli offset vanno ricalcolati, altrimenti il file diventa illeggibile.
Anonimizzazione senza perdita
Qui l'HEIC si complica. Il formato è stato pensato per archiviare video e immagini in modo efficiente, non per manipolare comodamente i metadati.
Il problema
La struttura basata sugli offset dell'HEIC rende rischioso rimuovere byte. Il box iloc contiene offset di byte precisi che puntano dentro mdat. Se rimuovi anche un solo box, quegli offset diventano sbagliati e l'immagine non si apre più.
L'approccio della sovrascrittura con zeri
Invece di rimuovere i box di metadati, PicScrub ne sovrascrive il contenuto con degli zeri, lasciando intatte struttura e dimensioni dei box.
Dopo: [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]
Perché sovrascrivere con zeri?
- • Il file resta integro:tutti gli offset restano validi
- • Nessuna ricompressione:i dati dell'immagine non si toccano
- • Metadati distrutti:gli zeri non contengono nessuna informazione
- • Reversibile?:no, i dati sovrascritti sono persi
Come PicScrub elabora gli HEIC
Analizzare la struttura dei box
Analizzare ricorsivamente ftyp e meta e individuare tutti i box
Trovare i metadati
Individuare le proprietà Exif e XMP dentro il contenitore ipco
Azzerare il contenuto dei metadati
Sovrascrivere con degli zeri il contenuto dei box di metadati
Lasciare intatta la struttura
Mantenere invariati intestazioni dei box, dimensioni e tutti gli offset
Una nota sulla dimensione del file
Siccome PicScrub sovrascrive con zeri invece di rimuovere, il file in uscita avrà la stessa dimensione di quello in entrata. Lo spazio dei metadati resta, ma è riempito di zeri.
HEIC, HEIF e AVIF
I nomi confondono, quindi mettiamo ordine. HEIF è il formato contenitore, mentre HEIC e AVIF dicono quale codec è stato usato per comprimere l'immagine dentro quel contenitore.
| Formato | Contenitore | Codec | Usato da |
|---|---|---|---|
| HEIC | HEIF | HEVC (H.265) | Dispositivi Apple |
| HEIF | HEIF | Vari | Contenitore generico |
| AVIF | HEIF | AV1 | Web (senza royalty) |
Tutti e tre usano la stessa struttura di contenitore ISOBMFF/HEIF, quindi l'approccio di PicScrub funziona per tutti.