PicScrub logoPicScrub
Torna ai formati

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

ftyp
meta
mdat
ftyp
24 byte
Tipo di file e brand
meta
1000 byte
Contenitore dei metadati
mdat
Lunghezza variabile
Dati multimediali (HEVC)

Intestazione HEIC (box ftyp)

Dimensione del box (24)
Tipo di box (ftyp)
Brand principale (heic)
Versione minore
Compatibile (mif1)
Compatibile (heic)
OffsetHexASCII
0000
000000186674797068656963
....ftypheic
000C
000000006D69663168656963
....mif1heic

Struttura di un box

SizeTypeData
4 byte (BE)4 byteSize - 8

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.

Brand compatibili: heic heix hevc hevx heim heis hevm hevs mif1 msf1

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

Prima: [Exif][Dati GPS: 37.7749, -122.4194][Fotocamera: iPhone]
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

1

Analizzare la struttura dei box

Analizzare ricorsivamente ftyp e meta e individuare tutti i box

2

Trovare i metadati

Individuare le proprietà Exif e XMP dentro il contenitore ipco

3

Azzerare il contenuto dei metadati

Sovrascrivere con degli zeri il contenuto dei box di metadati

4

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.

In entrata: 2,5 MB (con 50 KB di EXIF)
In uscita: 2,5 MB (50 KB 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.

FormatoContenitoreCodecUsato da
HEICHEIFHEVC (H.265)Dispositivi Apple
HEIFHEIFVariContenitore generico
AVIFHEIFAV1Web (senza royalty)

Tutti e tre usano la stessa struttura di contenitore ISOBMFF/HEIF, quindi l'approccio di PicScrub funziona per tutti.