JPEG
quello che perde di piùUn file JPEG tiene i suoi metadati in segmenti APPn, tra l'intestazione del file e i dati dell'immagine. Ecco che cosa sta dove e che cosa ne fa PicScrub.
Che cosa viene rimosso
- EXIF coordinate GPS, marca e modello della fotocamera, data e ora, impostazioni di scatto
- XMP cronologia delle modifiche, software usato, valutazioni
- IPTC / Photoshop didascalie, crediti, parole chiave
- Commenti e miniature incorporate una copia minuscola dell'originale che può sopravvivere ai tuoi ritagli e alle tue modifiche
Che cosa puoi tenere
- Dati dell'immagine sempre intatti, mai ricodificati
- Profilo colore ICC opzionale, così i colori restano fedeli
- Orientamento opzionale, così i ritratti restano dritti
- Avviso di copyright opzionale, per chi vuole il credito senza le coordinate
Come è fatto il file
Se hai mai aperto un JPEG in un editor esadecimale, avrai notato che è fatto di segmenti separati da marker. Ogni marker inizia con 0xFF, seguito da un byte che dice di che tipo di segmento si tratta. Questo disegno rende i JPEG piuttosto facili da analizzare: basta cercare i byte FF e guardare che cosa viene dopo.
La parte interessante per la privacy è che tutti i metadati (EXIF, GPS, data e ora) stanno in quei segmenti, del tutto separati dai dati veri dell'immagine. Ecco perché possiamo rimuovere i metadati senza toccare i pixel e senza ricomprimere niente.
Struttura di un file JPEG
Esempio di intestazione JPEG
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | FFD8FFE000104A464946000101000048 | ......JFIF.....H | |||||||||||||||
| 0010 | 00480000FFE112344578696600000000 | .H.....4Exif.. | |||||||||||||||
Struttura di un marker
FF xx:Marker (xx indica il tipo)LL LL:Lunghezza (2 byte, big-endian, sé stessa compresa)Data...:Dati del segmento (lunghezza - 2 byte)
Elenco completo dei marker JPEG
| Marker | Nome | Descrizione |
|---|---|---|
| FF D8 | SOI | Inizio dell'immagine |
| FF D9 | EOI | Fine dell'immagine |
| FF C0 | SOF0 | Inizio del frame (DCT baseline) |
| FF C2 | SOF2 | Inizio del frame (DCT progressivo) |
| FF C4 | DHT | Definizione della tabella di Huffman |
| FF DB | DQT | Definizione della tabella di quantizzazione |
| FF DD | DRI | Definizione dell'intervallo di restart |
| FF DA | SOS | Inizio della scansione (dopo arrivano i dati dell'immagine) |
| FF FE | COM | Commento (metadati) |
| FF E0 | APP0 | Marker JFIF |
| FF E1 | APP1 | Marker EXIF / XMP |
| FF E2 | APP2 | Profilo ICC / MPF |
| FF ED | APP13 | IPTC / Photoshop |
| FF EE | APP14 | Trasformazione colore di Adobe |
Oro = metadati (rimossi), senza evidenziazione = struttura che resta
JFIF contro EXIF
C'è una cosa che confonde parecchie persone: i file JPEG spesso contengono due standard di metadati diversi allo stesso tempo. JFIF è arrivato prima e si occupa delle basi, come la risoluzione. Poi le fotocamere hanno iniziato ad aggiungere i dati EXIF con tutte le informazioni di scatto. Quasi tutti i JPEG moderni hanno entrambi, ed è per questo che vedrai sia il marker APP0 sia l'APP1 vicino all'inizio del file.
APP0:JFIF
JPEG File Interchange Format. Informazioni di base sull'immagine.
- • Numero di versione
- • Densità dei pixel (DPI)
- • Proporzioni
- • Miniatura opzionale
APP1:EXIF
Exchangeable Image File Format. Metadati della fotocamera.
- • Marca e modello della fotocamera
- • Coordinate GPS
- • Data e ora
- • Impostazioni di scatto
I marker APP in dettaglio
Le specifiche JPEG hanno riservato 16 marker "applicativi" (da APP0 ad APP15) perché ogni produttore li usasse come voleva. Con gli anni, organizzazioni diverse si sono prese marker diversi per i loro formati di metadati. Il risultato è un piccolo caos, ma almeno è un caos ben documentato.
La parte complicata è che lo stesso marker può voler dire cose diverse a seconda del contenuto. APP1, per esempio, può contenere dati EXIF oppure XMP, quindi devi guardare la stringa identificativa all'interno per capire con quale hai a che fare.
APP0 (0xFFE0):JFIF
Identificatore: JFIF\0. Contiene la versione, le unità di densità, la densità X/Y e una miniatura incorporata opzionale. In genere si può tenere senza rischi.
APP1 (0xFFE1):EXIF
Identificatore: Exif\0\0. Contiene una struttura TIFF completa con voci IFD per i dati della fotocamera, il GPS, la data e l'ora, le miniature e le maker note. Il principale problema di privacy.
APP1 (0xFFE1):XMP
Identificatore: http://ns.adobe.com/xap/1.0/\0. Standard di metadati basato su XML creato da Adobe. Può contenere la cronologia delle modifiche, i dati del software e dati EXIF estesi.
Namespace 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 esteso
Identificatore: http://ns.adobe.com/xmp/extension/\0. Per i dati XMP oltre i 65 KB, divisi tra più segmenti APP1.
APP2 (0xFFE2):MPF
Identificatore: MPF\0. Multi-Picture Format, per immagini stereoscopiche e panoramiche.
APP2 (0xFFE2):Profilo ICC
Identificatore: ICC_PROFILE\0. Dati per la gestione del colore. Possono essere divisi tra più marker APP2. Di solito si può tenere senza rischi.
APP13 (0xFFED):IPTC/Photoshop
Identificatore: Photoshop 3.0\0. Contiene dati IPTC-IIM con didascalie, parole chiave, copyright e informazioni sull'autore. Può includere dati personali di chi ha scattato.
APP14 (0xFFEE):Adobe
Identificatore: Adobe\0. Contiene i flag di trasformazione del colore (RGB/CMYK). È importante per mostrare correttamente i colori.
La struttura di EXIF
Qui la cosa si fa interessante (e un po' strana). I dati EXIF sono in realtà un piccolo file TIFF incorporato dentro al tuo JPEG. Sì, davvero. Ha una sua intestazione, un suo ordine dei byte e usa la struttura IFD (Image File Directory) di TIFF per salvare i tag.
La prima cosa che vedrai dopo l'identificatore "Exif" è un'intestazione TIFF che dice se i dati sono little-endian (Intel, "II") o big-endian (Motorola, "MM"). Sbagliare qui significa che tutti i numeri usciranno senza senso, quindi è la prima cosa che controlla qualsiasi parser.
Intestazione TIFF (8 byte)
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
II = Intel (little-endian), MM = Motorola (big-endian)
Struttura di una voce IFD (12 byte)
Voci IFD principali
0x010F:Make0x0110:Model0x0132:DateTime0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0x927C:MakerNoteCome PicScrub elabora i JPEG
L'approccio è piuttosto diretto: percorriamo il file marker per marker, teniamo quelli indispensabili per mostrare l'immagine e saltiamo quelli che contengono metadati. Siccome non tocchiamo mai i dati compressi dell'immagine, non c'è nessuna perdita di qualità.
Il punto è che la struttura a marker di JPEG rende tutto facile. Non dobbiamo capire i coefficienti DCT né le tabelle di Huffman. Ci basta riconoscere quali segmenti sono metadati e quali no.
Controllare l'intestazione
Verificare il marker SOI (FF D8) all'inizio del file
Analizzare i marker
Leggere ogni marker in sequenza ed estrarne tipo e lunghezza
Riconoscere i metadati
Controllare gli identificatori dei segmenti APP (EXIF, XMP, IPTC e così via)
Copia selettiva
Copiare nel risultato i segmenti che non sono metadati e saltare quelli che lo sono
Che cosa resta
- • Marker SOI/EOI (obbligatori)
- • DQT (tabelle di quantizzazione)
- • SOF (intestazione del frame)
- • DHT (tabelle di Huffman)
- • SOS e dati della scansione (l'immagine vera e propria)
- • Opzionale: profilo colore ICC (configurabile)
Che cosa viene rimosso
- • APP1 EXIF (fotocamera, GPS, data e ora)
- • APP1 XMP (metadati di modifica)
- • APP13 IPTC (didascalie, autore)
- • Marker COM (commenti)
- • Miniature EXIF
Elenco dei tag EXIF
Non tutti i tag EXIF pesano allo stesso modo sulla privacy. Alcuni, come le impostazioni di scatto, sono piuttosto innocui. Altri, come i numeri di serie o il nome del proprietario, possono identificare te o la tua attrezzatura in modo univoco. Questi sono quelli che consideriamo ad alto rischio:
| ID del tag | Nome | Rischio per la privacy |
|---|---|---|
| 0x9003 | DateTimeOriginal | Alto |
| 0x9004 | DateTimeDigitized | Alto |
| 0x9010 | OffsetTime | Medio |
| 0x9286 | UserComment | Alto |
| 0x927C | MakerNote | Alto |
| 0xA420 | ImageUniqueID | Alto |
| 0xA430 | CameraOwnerName | Alto |
| 0xA431 | BodySerialNumber | Alto |
| 0xA434 | LensModel | Medio |
| 0xA435 | LensSerialNumber | Alto |
| 0xFDE8 | OwnerName | Alto |
| 0xFDE9 | SerialNumber | Alto |
Vedi tutti i tag delle impostazioni di scatto (non identificativi)
0x829A ExposureTime0x829D FNumber0x8822 ExposureProgram0x8827 ISOSpeedRatings0x9201 ShutterSpeedValue0x9202 ApertureValue0x9203 BrightnessValue0x9204 ExposureBiasValue0x9207 MeteringMode0x9208 LightSource0x9209 Flash0x920A FocalLength0xA001 ColorSpace0xA002 PixelXDimension0xA003 PixelYDimension0xA402 ExposureMode0xA403 WhiteBalance0xA405 FocalLengthIn35mmFilm0xA406 SceneCaptureTypeElenco dei tag GPS
I dati GPS stanno in un sub-IFD tutto loro, a cui punta il tag 0x8825 dell'IFD principale. Se quel puntatore c'è, nella tua immagine ci sono dati di posizione. Gli smartphone di oggi sono particolarmente insistenti su questo, spesso con una precisione tale da indicare il punto esatto in cui eri.
| ID del tag | Nome | Descrizione |
|---|---|---|
| 0x0000 | GPSVersionID | Versione dei tag GPS |
| 0x0001 | GPSLatitudeRef | N o S |
| 0x0002 | GPSLatitude | Gradi, minuti e secondi |
| 0x0003 | GPSLongitudeRef | E o W |
| 0x0004 | GPSLongitude | Gradi, minuti e secondi |
| 0x0005 | GPSAltitudeRef | Sopra o sotto il livello del mare |
| 0x0006 | GPSAltitude | Metri |
| 0x0007 | GPSTimeStamp | Ora UTC |
| 0x001D | GPSDateStamp | Data UTC |
| 0x0012 | GPSMapDatum | Datum geodetico usato |
| 0x001B | GPSProcessingMethod | GPS/CELLID/WLAN/MANUAL |
| 0x001C | GPSAreaInformation | Nome del luogo |
Elenco dei tag IPTC
IPTC è nato perché le agenzie di stampa potessero incorporare didascalie, crediti e informazioni di copyright. Si salva dentro APP13 con l'identificatore "Photoshop 3.0" (sì, l'ha adottato Adobe). Se hai mai aggiunto informazioni di copyright o parole chiave in Lightroom o Photoshop, è lì che vanno a finire.
0x0250 By-line (autore)0x0255 By-line Title (ruolo dell'autore)0x025A City (città)0x025C Sub-location (località precisa)0x025F Province/State (provincia o regione)0x0265 Country Name (paese)0x0274 Copyright Notice (avviso di copyright)0x0276 Contact (contatto)0x0237 Date Created (data di creazione)0x023C Time Created (ora di creazione)0x0278 Caption/Abstract (didascalia)0x0219 Keywords (parole chiave)