PicScrub logoPicScrub
Torna ai formati

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.

profilo colore, si tiene se vuoi
SOIinizio
APP0JFIF
APP1EXIF
APP1XMP
APP2ICC
APP13IPTC
COMcommento
SOS …la tua foto vera, intatta
EOIfine
qui si nascondono GPS e fotocamera, rimossi
identico byte per byte

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

SOI
APP0-15
DQT
SOF
DHT
SOS + Data
EOI
SOI
2 byte
Inizio dell'immagine (FF D8)
APP0-15
100 byte
Marker applicativi (metadati)
DQT
130 byte
Tabelle di quantizzazione
SOF
20 byte
Inizio del frame
DHT
420 byte
Tabelle di Huffman
SOS + Data
Lunghezza variabile
Dati della scansione (l'immagine)
EOI
2 byte
Fine dell'immagine (FF D9)

Esempio di intestazione JPEG

SOI (inizio dell'immagine)
Marker APP0
Lunghezza di APP0
Identificatore JFIF
Dati JFIF
Marker APP1
Lunghezza di APP1
Identificatore Exif
OffsetHexASCII
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

MarkerNomeDescrizione
FF D8SOIInizio dell'immagine
FF D9EOIFine dell'immagine
FF C0SOF0Inizio del frame (DCT baseline)
FF C2SOF2Inizio del frame (DCT progressivo)
FF C4DHTDefinizione della tabella di Huffman
FF DBDQTDefinizione della tabella di quantizzazione
FF DDDRIDefinizione dell'intervallo di restart
FF DASOSInizio della scansione (dopo arrivano i dati dell'immagine)
FF FECOMCommento (metadati)
FF E0APP0Marker JFIF
FF E1APP1Marker EXIF / XMP
FF E2APP2Profilo ICC / MPF
FF EDAPP13IPTC / Photoshop
FF EEAPP14Trasformazione 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)

Ordine dei byte (II = little-endian)
Numero magico (42)
Offset di IFD0
OffsetHexASCII
0000
49492A0008000000
II*.....

II = Intel (little-endian), MM = Motorola (big-endian)

Struttura di una voce IFD (12 byte)

ID del tagTipoConteggioValore/offset
2 byte2 byte4 byte4 byte

Voci IFD principali

0x010F:Make
0x0110:Model
0x0132:DateTime
0x8769:ExifIFDPointer
0x8825:GPSInfoIFDPointer
0x927C:MakerNote

Come 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.

1

Controllare l'intestazione

Verificare il marker SOI (FF D8) all'inizio del file

2

Analizzare i marker

Leggere ogni marker in sequenza ed estrarne tipo e lunghezza

3

Riconoscere i metadati

Controllare gli identificatori dei segmenti APP (EXIF, XMP, IPTC e così via)

4

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 tagNomeRischio per la privacy
0x9003DateTimeOriginalAlto
0x9004DateTimeDigitizedAlto
0x9010OffsetTimeMedio
0x9286UserCommentAlto
0x927CMakerNoteAlto
0xA420ImageUniqueIDAlto
0xA430CameraOwnerNameAlto
0xA431BodySerialNumberAlto
0xA434LensModelMedio
0xA435LensSerialNumberAlto
0xFDE8OwnerNameAlto
0xFDE9SerialNumberAlto
Vedi tutti i tag delle impostazioni di scatto (non identificativi)
0x829A ExposureTime
0x829D FNumber
0x8822 ExposureProgram
0x8827 ISOSpeedRatings
0x9201 ShutterSpeedValue
0x9202 ApertureValue
0x9203 BrightnessValue
0x9204 ExposureBiasValue
0x9207 MeteringMode
0x9208 LightSource
0x9209 Flash
0x920A FocalLength
0xA001 ColorSpace
0xA002 PixelXDimension
0xA003 PixelYDimension
0xA402 ExposureMode
0xA403 WhiteBalance
0xA405 FocalLengthIn35mmFilm
0xA406 SceneCaptureType

Elenco 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 tagNomeDescrizione
0x0000GPSVersionIDVersione dei tag GPS
0x0001GPSLatitudeRefN o S
0x0002GPSLatitudeGradi, minuti e secondi
0x0003GPSLongitudeRefE o W
0x0004GPSLongitudeGradi, minuti e secondi
0x0005GPSAltitudeRefSopra o sotto il livello del mare
0x0006GPSAltitudeMetri
0x0007GPSTimeStampOra UTC
0x001DGPSDateStampData UTC
0x0012GPSMapDatumDatum geodetico usato
0x001BGPSProcessingMethodGPS/CELLID/WLAN/MANUAL
0x001CGPSAreaInformationNome 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)