PicScrub logoPicScrub
Torna ai formati

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

Header
IFD0
Strip Data
EXIF IFD
GPS IFD
Header
8 byte
Ordine dei byte + numero magico + offset dell'IFD
IFD0
200 byte
Directory dell'immagine principale
Strip Data
Lunghezza variabile
Dati dei pixel dell'immagine
EXIF IFD
500 byte
Sotto-directory EXIF
GPS IFD
100 byte
Sotto-directory GPS

Intestazione TIFF

Ordine dei byte (II = little-endian)
Numero magico (42)
Offset del primo IFD
OffsetHexASCII
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

2 byteNumero di voci (quanti tag ci sono)
12 × N byteVoci dei tag (12 byte ciascuna)
4 byteOffset dell'IFD successivo (0 se non c'è)

Struttura di una voce di tag (12 byte)

ID del tagTipoConteggioValore/offset
2 byte2 byte4 byte4 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.

IDNomeDimensioneDescrizione
1BYTE1Intero a 8 bit senza segno
2ASCII1Stringa terminata da null (8 bit)
3SHORT2Intero a 16 bit senza segno
4LONG4Intero a 32 bit senza segno
5RATIONAL8Due LONG: numeratore/denominatore
6SBYTE1Intero a 8 bit con segno
7UNDEFINED1Byte grezzi (dati binari)
8SSHORT2Intero a 16 bit con segno
9SLONG4Intero a 32 bit con segno
10SRATIONAL8Due SLONG: num./den. con segno
11FLOAT4Float IEEE a 32 bit
12DOUBLE8Double IEEE a 64 bit
13IFD4Puntatore 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:

// posizione di IFD0
IFD0_offset = bytes[4:8] // dall'intestazione TIFF
// posizione dell'IFD successivo (per esempio IFD1 per la miniatura)
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
// posizione dei SubIFD (EXIF, GPS)
subIFD_offset = tag_value // dal tag puntatore (0x8769, 0x8825)

I tag importanti

Tag dei dati immagine (mantenuti)

0x0100:ImageWidth
0x0101:ImageLength
0x0102:BitsPerSample
0x0103:Compression
0x0111:StripOffsets
0x0117:StripByteCounts

Tag di metadati (rimossi)

0x010F:Make (produttore della fotocamera)
0x0110:Model (modello della fotocamera)
0x0132:DateTime
0x013B:Artist
0x8298:Copyright
0x9003:DateTimeOriginal

Tag puntatore (sub-IFD)

0x8769:ExifIFDPointer
0x8825:GPSInfoIFDPointer
0xA005:InteroperabilityIFDPointer

I 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

1

Analizzare l'intestazione

Capire l'ordine dei byte (II/MM) e individuare il primo IFD

2

Costruire la lista dei tag ammessi

Individuare i tag indispensabili per mostrare l'immagine

3

Filtrare le voci degli IFD

Rimuovere i tag di metadati e azzerare i puntatori ai SubIFD

4

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.