JPEG
le plus bavardUn fichier JPEG stocke ses métadonnées dans des segments APPn, entre l'en-tête du fichier et les données d'image. Voici ce qui se trouve où, et ce que PicScrub fait de chaque partie.
Ce qui est supprimé
- EXIF coordonnées GPS, marque et modèle de l'appareil, horodatages, réglages d'exposition
- XMP historique d'édition, logiciel utilisé, notes
- IPTC / Photoshop légendes, crédits, mots-clés
- Commentaires et vignettes intégrées une copie minuscule de l'original qui peut survivre à vos recadrages
Ce que vous pouvez garder
- Données d'image toujours intactes, jamais réencodées
- Profil de couleur ICC optionnel, pour des couleurs fidèles
- Orientation optionnelle, pour que les portraits restent droits
- Mention de copyright optionnelle, pour un crédit sans coordonnées
Vue d’ensemble de la structure
Si vous avez déjà ouvert un JPEG dans un éditeur hexadécimal, vous avez remarqué qu’il se compose de segments séparés par des marqueurs. Chaque marqueur commence par 0xFF, suivi d’un octet qui indique le type de segment. Cette conception rend les JPEG relativement faciles à analyser : il suffit de repérer les octets FF et de regarder ce qui suit.
Du point de vue de la vie privée, l’essentiel est que toutes les métadonnées (EXIF, GPS, horodatages) résident dans ces segments, totalement séparées des données d’image. C’est pour cela que nous pouvons supprimer les métadonnées sans toucher aux pixels ni recompresser quoi que ce soit.
Structure d’un fichier JPEG
Exemple d’en-tête JPEG
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | FFD8FFE000104A464946000101000048 | ......JFIF.....H | |||||||||||||||
| 0010 | 00480000FFE112344578696600000000 | .H.....4Exif.. | |||||||||||||||
Structure d’un marqueur
FF xx: marqueur (xx indique le type)LL LL: longueur (2 octets, big-endian, elle s’inclut elle-même)Data...: données du segment (longueur - 2 octets)
Référence complète des marqueurs JPEG
| Marqueur | Nom | Description |
|---|---|---|
| FF D8 | SOI | Début d’image |
| FF D9 | EOI | Fin d’image |
| FF C0 | SOF0 | Début de trame (DCT de base) |
| FF C2 | SOF2 | Début de trame (DCT progressive) |
| FF C4 | DHT | Définition de table de Huffman |
| FF DB | DQT | Définition de table de quantification |
| FF DD | DRI | Définition de l’intervalle de redémarrage |
| FF DA | SOS | Début du balayage (les données d’image suivent) |
| FF FE | COM | Commentaire (métadonnées) |
| FF E0 | APP0 | Marqueur JFIF |
| FF E1 | APP1 | Marqueur EXIF / XMP |
| FF E2 | APP2 | Profil ICC / MPF |
| FF ED | APP13 | IPTC / Photoshop |
| FF EE | APP14 | Transformation colorimétrique Adobe |
Doré = métadonnées (supprimées), sans surlignage = structure conservée
JFIF ou EXIF ?
Voici ce qui déroute beaucoup de monde : les fichiers JPEG contiennent souvent deux standards de métadonnées à la fois. JFIF est arrivé en premier et gère les informations de base, comme la résolution. Puis les appareils photo se sont mis à ajouter des données EXIF, avec tous les détails de prise de vue. La plupart des JPEG modernes possèdent les deux, d’où la présence des marqueurs APP0 et APP1 en début de fichier.
APP0 : JFIF
JPEG File Interchange Format. Informations de base sur l’image.
- • Numéro de version
- • Densité de pixels (DPI)
- • Rapport d’aspect
- • Miniature optionnelle
APP1 : EXIF
Exchangeable Image File Format. Métadonnées de l’appareil photo.
- • Marque et modèle de l’appareil
- • Coordonnées GPS
- • Horodatages
- • Réglages d’exposition
Les marqueurs APP en détail
La spécification JPEG réserve 16 marqueurs « application » (APP0 à APP15) que les éditeurs peuvent utiliser à leur guise. Au fil des années, différentes organisations se sont approprié tel ou tel marqueur pour leur format de métadonnées. Le résultat est un peu brouillon, mais au moins c’est un désordre bien documenté.
La subtilité, c’est qu’un même marqueur peut signifier des choses différentes selon son contenu. APP1, par exemple, peut contenir des données EXIF ou XMP : il faut donc lire la chaîne d’identification qu’il renferme pour savoir à quoi on a affaire.
APP0 (0xFFE0) : JFIF
Identifiant : JFIF\0. Contient la version, les unités de densité, les densités X/Y et une miniature optionnelle. Sans risque à conserver, en général.
APP1 (0xFFE1) : EXIF
Identifiant : Exif\0\0. Contient une structure TIFF complète, avec des entrées IFD pour les infos de l’appareil, les données GPS, les horodatages, les miniatures et les notes du fabricant. Principal risque pour la vie privée.
APP1 (0xFFE1) : XMP
Identifiant : http://ns.adobe.com/xap/1.0/\0. Standard de métadonnées en XML créé par Adobe. Peut contenir l’historique de retouche, des informations sur le logiciel et des données EXIF étendues.
Espaces de noms XMP
xmp: http://ns.adobe.com/xap/1.0/xmpMM: http://ns.adobe.com/xap/1.0/mm/dc: http://purl.org/dc/elements/1.1/photoshop: http://ns.adobe.com/photoshop/1.0/tiff: http://ns.adobe.com/tiff/1.0/exif: http://ns.adobe.com/exif/1.0/APP1 (0xFFE1) : XMP étendu
Identifiant : http://ns.adobe.com/xmp/extension/\0. Pour les données XMP dépassant 65 Ko, réparties sur plusieurs segments APP1.
APP2 (0xFFE2) : MPF
Identifiant : MPF\0. Multi-Picture Format, pour les images stéréoscopiques et les panoramas.
APP2 (0xFFE2) : profil ICC
Identifiant : ICC_PROFILE\0. Données de gestion des couleurs. Peuvent être réparties sur plusieurs marqueurs APP2. Généralement sans risque à conserver.
APP13 (0xFFED) : IPTC/Photoshop
Identifiant : Photoshop 3.0\0. Contient des données IPTC-IIM : légendes, mots-clés, copyright, informations sur le créateur. Peut contenir des informations sur l’auteur.
APP14 (0xFFEE) : Adobe
Identifiant : Adobe\0. Contient les indicateurs de transformation colorimétrique (RGB/CMYK). Important pour un rendu correct des couleurs.
La structure EXIF
C’est là que ça devient intéressant (et un peu étrange). Les données EXIF sont en réalité un minuscule fichier TIFF intégré à votre JPEG. Oui, vraiment. Elles ont leur propre en-tête, leur propre ordre des octets, et utilisent la structure IFD (Image File Directory) de TIFF pour stocker les tags.
La première chose qui suit l’identifiant « Exif » est un en-tête TIFF, qui indique si les données sont en little-endian (Intel, « II ») ou en big-endian (Motorola, « MM »). Se tromper là-dessus, c’est obtenir des nombres totalement faux : c’est donc la première chose que vérifie tout analyseur.
En-tête TIFF (8 octets)
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
II = Intel (little-endian), MM = Motorola (big-endian)
Structure d’une entrée IFD (12 octets)
Entrées IFD importantes
0x010F : Make0x0110 : Model0x0132 : DateTime0x8769 : ExifIFDPointer0x8825 : GPSInfoIFDPointer0x927C : MakerNoteComment PicScrub traite le JPEG
L’approche est plutôt directe : nous parcourons le fichier marqueur par marqueur, conservons ceux qui sont indispensables à l’affichage de l’image et ignorons ceux qui contiennent des métadonnées. Comme nous ne touchons jamais aux données d’image compressées, il n’y a aucune perte de qualité.
L’essentiel est que la structure du JPEG, fondée sur des marqueurs, rend l’opération simple. Nul besoin de comprendre les coefficients DCT ou les tables de Huffman : il suffit de distinguer les segments qui sont des métadonnées de ceux qui n’en sont pas.
Valider l’en-tête
Vérifier le marqueur SOI (FF D8) au début du fichier
Analyser les marqueurs
Lire chaque marqueur dans l’ordre et en extraire le type et la longueur
Identifier les métadonnées
Contrôler les identifiants des segments APP (EXIF, XMP, IPTC, etc.)
Copie sélective
Recopier les segments utiles dans le fichier de sortie et ignorer ceux de métadonnées
Ce qui est conservé
- • Marqueurs SOI/EOI (obligatoires)
- • DQT (tables de quantification)
- • SOF (en-tête de trame)
- • DHT (tables de Huffman)
- • SOS et données de balayage (l’image elle-même)
- • En option : profil colorimétrique ICC (configurable)
Ce qui est supprimé
- • APP1 EXIF (appareil, GPS, horodatages)
- • APP1 XMP (métadonnées de retouche)
- • APP13 IPTC (légendes, auteur)
- • Marqueurs COM (commentaires)
- • Miniatures EXIF
Référence des tags EXIF
Tous les tags EXIF ne se valent pas en matière de vie privée. Certains, comme les réglages d’exposition, sont plutôt inoffensifs. D’autres, comme les numéros de série ou le nom du propriétaire, permettent de vous identifier, vous ou votre matériel. Voici ceux que nous considérons comme à haut risque :
| ID du tag | Nom | Risque pour la vie privée |
|---|---|---|
| 0x9003 | DateTimeOriginal | Élevé |
| 0x9004 | DateTimeDigitized | Élevé |
| 0x9010 | OffsetTime | Moyen |
| 0x9286 | UserComment | Élevé |
| 0x927C | MakerNote | Élevé |
| 0xA420 | ImageUniqueID | Élevé |
| 0xA430 | CameraOwnerName | Élevé |
| 0xA431 | BodySerialNumber | Élevé |
| 0xA434 | LensModel | Moyen |
| 0xA435 | LensSerialNumber | Élevé |
| 0xFDE8 | OwnerName | Élevé |
| 0xFDE9 | SerialNumber | Élevé |
Voir tous les tags de réglage de l’appareil (non identifiants)
0x829A ExposureTime0x829D FNumber0x8822 ExposureProgram0x8827 ISOSpeedRatings0x9201 ShutterSpeedValue0x9202 ApertureValue0x9203 BrightnessValue0x9204 ExposureBiasValue0x9207 MeteringMode0x9208 LightSource0x9209 Flash0x920A FocalLength0xA001 ColorSpace0xA002 PixelXDimension0xA003 PixelYDimension0xA402 ExposureMode0xA403 WhiteBalance0xA405 FocalLengthIn35mmFilm0xA406 SceneCaptureTypeRéférence des tags GPS
Les données GPS résident dans leur propre sous-IFD, désigné par le tag 0x8825 de l’IFD principal. Si ce pointeur existe, votre image contient des données de localisation. Les smartphones récents sont particulièrement zélés sur ce point, souvent avec une précision suffisante pour indiquer exactement où vous vous teniez.
| ID du tag | Nom | Description |
|---|---|---|
| 0x0000 | GPSVersionID | Version des tags GPS |
| 0x0001 | GPSLatitudeRef | N ou S |
| 0x0002 | GPSLatitude | Degrés, minutes, secondes |
| 0x0003 | GPSLongitudeRef | E ou W |
| 0x0004 | GPSLongitude | Degrés, minutes, secondes |
| 0x0005 | GPSAltitudeRef | Au-dessus ou au-dessous du niveau de la mer |
| 0x0006 | GPSAltitude | Mètres |
| 0x0007 | GPSTimeStamp | Heure UTC |
| 0x001D | GPSDateStamp | Date UTC |
| 0x0012 | GPSMapDatum | Système géodésique de référence |
| 0x001B | GPSProcessingMethod | GPS/CELLID/WLAN/MANUAL |
| 0x001C | GPSAreaInformation | Nom du lieu |
Référence des tags IPTC
L’IPTC a été conçu pour que les agences de presse puissent intégrer légendes, crédits et mentions de copyright. Ces données sont stockées dans APP13, avec l’identifiant « Photoshop 3.0 » (oui, Adobe l’a repris à son compte). Si vous avez déjà ajouté un copyright ou des mots-clés dans Lightroom ou Photoshop, c’est là qu’ils atterrissent.
0x0250 By-line (auteur)0x0255 Fonction de l’auteur0x025A Ville0x025C Lieu précis0x025F Région / État0x0265 Nom du pays0x0274 Mention de copyright0x0276 Contact0x0237 Date de création0x023C Heure de création0x0278 Légende / résumé0x0219 Mots-clés