PicScrub logoPicScrub
Retour aux formats

Format HEIC

High Efficiency Image Container

Le conteneur ISOBMFF

Si vous avez déjà travaillé avec des fichiers vidéo MP4, HEIC vous semblera familier. Apple a retenu l’ISO Base Media File Format (ISOBMFF) comme conteneur pour HEIC : ce format a donc davantage en commun avec la vidéo qu’avec les formats d’image traditionnels comme JPEG ou PNG.

Il se compose de « boîtes » imbriquées (aussi appelées atomes), identifiées par un code de quatre caractères. Une conception étonnamment élégante, qui autorise des hiérarchies de données complexes tout en restant relativement simple à analyser une fois les bases acquises.

Structure d’un fichier HEIC

ftyp
meta
mdat
ftyp
24 octets
Type de fichier et marques
meta
1000 octets
Conteneur de métadonnées
mdat
Longueur variable
Données média (HEVC)

En-tête HEIC (boîte ftyp)

Taille de la boîte (24)
Type de boîte (ftyp)
Marque principale (heic)
Version mineure
Compatible (mif1)
Compatible (heic)
OffsetHexASCII
0000
000000186674797068656963
....ftypheic
000C
000000006D69663168656963
....mif1heic

Structure d’une boîte

TailleTypeDonnées
4 octets (BE)4 octetsTaille - 8

Si la taille vaut 1, une taille étendue sur 8 octets suit le type. Si elle vaut 0, la boîte s’étend jusqu’à la fin du fichier.

Les boîtes principales

La hiérarchie des boîtes d’un fichier HEIC peut devenir profonde. Contrairement au JPEG, où les métadonnées se trouvent à des positions prévisibles, HEIC enfouit les siennes plusieurs niveaux plus bas, dans une structure imbriquée. Voici comment s’articulent les principaux éléments.

ftyp : type de fichier

Première boîte du fichier. Contient la marque principale et les marques compatibles. Indispensable à l’identification du format.

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

meta : conteneur de métadonnées

Contient toutes les métadonnées : emplacement des éléments, propriétés et associations. C’est là que résident les données EXIF/XMP.

meta (conteneur de métadonnées)
├── hdlr  (référence du gestionnaire)
├── pitm  (identifiant de l'élément principal)
├── iloc  (emplacement des éléments → offsets dans mdat)
│   └── entrées [item_id, offset, longueur]
├── iinf  (infos sur les éléments → repérer l'élément « Exif »)
│   └── entrées infe avec les types d'éléments
├── iprp  (propriétés des éléments)
│   ├── ipco (conteneur de propriétés)
│   │   ├── hvcC  (configuration du décodeur HEVC)
│   │   ├── ispe  (dimensions de l'image)
│   │   ├── colr  (profil ICC, offset+12)
│   │   ├── Exif  (EXIF au format TIFF)
│   │   └── pixi  (informations sur les pixels)
│   └── ipma (associations de propriétés)
└── iref  (références entre éléments)

mdat : données média

Contient les données d’image encodées en HEVC. La boîte iloc, dans meta, fournit les offsets vers mdat.

Les métadonnées dans HEIC

Si vous êtes habitué aux marqueurs APP du JPEG, HEIC procède tout autrement. Au lieu de marqueurs séquentiels en début de fichier, les métadonnées prennent la forme de « propriétés d’élément » à l’intérieur de la boîte meta. Les données EXIF restent au format TIFF habituel, mais il faut d’abord naviguer dans la hiérarchie de boîtes pour les trouver.

Propriété EXIF

Stockée dans ipco (conteneur de propriétés d’élément) avec le type « Exif ». Contient des données EXIF standard au format TIFF, comme dans un JPEG.

Propriété XMP

Métadonnées XML stockées comme propriété de type « mime », avec le content-type « application/rdf+xml ».

Profil ICC

Profil colorimétrique stocké dans une boîte « colr » de type « prof ».

Pourquoi les offsets sont critiques

La boîte iloc contient des offsets d’octets précis qui pointent dans mdat. Si la taille d’une boîte change (parce qu’on a supprimé des métadonnées, par exemple), ces offsets doivent être recalculés, sans quoi le fichier devient illisible.

L’anonymisation sans perte

C’est ici que HEIC se complique. Le format a été conçu pour un stockage efficace d’images et de vidéos, pas pour faciliter la manipulation des métadonnées.

Le problème

La structure de HEIC, fondée sur des offsets, rend tout retrait d’octets risqué. La boîte iloc contient des offsets d’octets précis qui pointent dans mdat. Si vous supprimez ne serait-ce qu’une boîte, ces offsets deviennent faux et l’image ne s’ouvre plus.

L’approche par écrasement avec des zéros

Plutôt que de supprimer les boîtes de métadonnées, PicScrub en écrase le contenu avec des zéros, tout en préservant la structure et la taille des boîtes.

Avant : [Exif][GPS : 37.7749, -122.4194][Appareil : iPhone]
Après : [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]

Pourquoi écraser avec des zéros ?

  • • Intégrité du fichier préservée : tous les offsets restent valides
  • • Aucune recompression : les données d’image ne sont pas touchées
  • • Métadonnées détruites : des zéros ne contiennent aucune information
  • • Réversible ? : non, les données écrasées sont perdues

Comment PicScrub traite le HEIC

1

Analyser la structure des boîtes

Analyser récursivement ftyp et meta, et identifier toutes les boîtes

2

Localiser les métadonnées

Trouver les propriétés Exif et XMP dans le conteneur ipco

3

Mettre le contenu à zéro

Écraser le contenu des boîtes de métadonnées avec des zéros

4

Préserver la structure

Conserver les en-têtes, les tailles de boîtes et tous les offsets inchangés

À propos de la taille du fichier

Comme PicScrub écrase les métadonnées avec des zéros au lieu de les supprimer, le fichier de sortie fait exactement la même taille que le fichier d’entrée. L’espace des métadonnées est conservé, mais rempli de zéros.

Entrée : 2,5 Mo (dont 50 Ko d’EXIF)
Sortie : 2,5 Mo (50 Ko de zéros)

HEIC, HEIF ou AVIF ?

La nomenclature prête à confusion, alors clarifions les choses. HEIF est le format de conteneur, tandis que HEIC et AVIF désignent le codec utilisé pour compresser l’image à l’intérieur de ce conteneur.

FormatConteneurCodecUtilisé par
HEICHEIFHEVC (H.265)Les appareils Apple
HEIFHEIFDiversConteneur générique
AVIFHEIFAV1Le Web (libre de redevances)

Tous trois reposent sur la même structure de conteneur ISOBMFF/HEIF : l’approche de PicScrub fonctionne donc pour les trois.