Formato TIFF
Tagged Image File Format
La struttura dell'intestazione
TIFF è il nonno dei metadati delle immagini. Quando vedi dei dati EXIF in un JPEG, in realtà stai guardando una struttura TIFF incorporata nel file. Capire TIFF vuol dire capire come funzionano quasi tutti i metadati delle immagini.
Il formato inizia con un'intestazione di 8 byte che dice due cose fondamentali: l'ordine dei byte (Intel o Motorola) e dove trovare il primo IFD. Da lì in poi è tutto un inseguire puntatori.
Struttura di un file TIFF
Intestazione TIFF
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
L'ordine dei byte
49 49 (II)Intel:little-endian (prima il byte meno significativo)
4D 4D (MM)Motorola:big-endian (prima il byte più significativo)
La struttura degli IFD
IFD sta per Image File Directory, ma puoi pensarlo come un indice. È un elenco piatto di tag, ognuno dei quali punta a un pezzo di dati. La parte ingegnosa è che gli IFD possono puntare ad altri IFD, creando una struttura ad albero.
Com'è fatto un IFD
Struttura di una voce di tag (12 byte)
Se il dato sta in 4 byte, viene salvato direttamente nel campo del valore. Altrimenti il campo contiene un offset che punta al dato.
I tipi di tag
TIFF è fortemente tipizzato. Ogni tag non dice solo che cosa contiene, ma anche come vanno interpretati i byte. Ecco perché per analizzare correttamente un TIFF devi conoscere il sistema dei tipi.
| ID | Nome | Dimensione | Descrizione |
|---|---|---|---|
| 1 | BYTE | 1 | Intero a 8 bit senza segno |
| 2 | ASCII | 1 | Stringa terminata da null (8 bit) |
| 3 | SHORT | 2 | Intero a 16 bit senza segno |
| 4 | LONG | 4 | Intero a 32 bit senza segno |
| 5 | RATIONAL | 8 | Due LONG: numeratore/denominatore |
| 6 | SBYTE | 1 | Intero a 8 bit con segno |
| 7 | UNDEFINED | 1 | Byte grezzi (dati binari) |
| 8 | SSHORT | 2 | Intero a 16 bit con segno |
| 9 | SLONG | 4 | Intero a 32 bit con segno |
| 10 | SRATIONAL | 8 | Due SLONG: num./den. con segno |
| 11 | FLOAT | 4 | Float IEEE a 32 bit |
| 12 | DOUBLE | 8 | Double IEEE a 64 bit |
| 13 | IFD | 4 | Puntatore a un IFD annidato |
La regola per salvare i valori
Se dimensione × conteggio ≤ 4 byte, il valore viene salvato direttamente nel campo da 4 byte. Altrimenti il campo contiene un offset che punta al punto del file in cui si trova il dato.
Come si calcolano gli offset degli IFD
La parte più difficile nell'analizzare un TIFF è seguire la catena degli offset. Tutto è relativo all'inizio del file e ti tocca saltare parecchio da una parte all'altra. Ecco come funzionano i conti:
IFD0_offset = bytes[4:8] // dall'intestazione TIFF
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
subIFD_offset = tag_value // dal tag puntatore (0x8769, 0x8825)
I tag importanti
Tag dei dati immagine (mantenuti)
0x0100:ImageWidth0x0101:ImageLength0x0102:BitsPerSample0x0103:Compression0x0111:StripOffsets0x0117:StripByteCountsTag di metadati (rimossi)
0x010F:Make (produttore della fotocamera)0x0110:Model (modello della fotocamera)0x0132:DateTime0x013B:Artist0x8298:Copyright0x9003:DateTimeOriginalTag puntatore (sub-IFD)
0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0xA005:InteroperabilityIFDPointerI SubIFD
L'IFD principale (IFD0) contiene spesso dei "tag puntatore" che rimandano a sotto-directory. È così che EXIF, GPS e gli altri metadati vengono organizzati in gruppi logici, lasciando pulito l'IFD principale.
SubIFD EXIF
Contiene i metadati della fotocamera: esposizione, apertura, ISO, lunghezza focale, flash, bilanciamento del bianco e altro.
SubIFD GPS
Contiene i dati di geolocalizzazione: latitudine, longitudine, altitudine, orario, satelliti, velocità e direzione. Un grosso problema di privacy.
Maker note
Dati proprietari della fotocamera. Il formato cambia da un produttore all'altro. Possono contenere numeri di serie, versione del firmware e impostazioni personalizzate.
Come PicScrub elabora i TIFF
Analizzare l'intestazione
Capire l'ordine dei byte (II/MM) e individuare il primo IFD
Costruire la lista dei tag ammessi
Individuare i tag indispensabili per mostrare l'immagine
Filtrare le voci degli IFD
Rimuovere i tag di metadati e azzerare i puntatori ai SubIFD
Riscrivere il file
Ricostruire il TIFF con IFD puliti e i dati dell'immagine copiati
Il ricalcolo degli offset
I file TIFF usano gli offset ovunque. Quando i metadati vengono rimossi, PicScrub deve ricalcolare tutti gli offset per mantenere integro il file.