PicScrub logoPicScrub
Terug naar de formaten

Het TIFF-formaat

Tagged Image File Format

De opbouw van de header

TIFF is de grootvader van alle metadata in afbeeldingen. Zie je EXIF-gegevens in een JPEG, dan kijk je eigenlijk naar een TIFF-structuur die in dat bestand is ingesloten. Snap je TIFF, dan snap je hoe de meeste metadata in afbeeldingen werkt.

Het formaat begint met een header van 8 bytes die twee cruciale dingen prijsgeeft: de byte-volgorde (Intel of Motorola) en waar de eerste IFD te vinden is. Daarna is het vooral pointers volgen.

Structuur van een TIFF-bestand

Header
IFD0
Strip Data
EXIF IFD
GPS IFD
Header
8 bytes
Byte-volgorde + magic number + offset van de IFD
IFD0
200 bytes
De directory van de hoofdafbeelding
Strip Data
Variabele lengte
De pixelgegevens
EXIF IFD
500 bytes
De EXIF-subdirectory
GPS IFD
100 bytes
De GPS-subdirectory

De TIFF-header

Byte-volgorde (II = little-endian)
Magic number (42)
Offset van de eerste IFD
OffsetHexASCII
0000
49492A0008000000
II*.....

De byte-volgorde

49 49 (II)

Intel:little-endian (de minst significante byte eerst)

4D 4D (MM)

Motorola:big-endian (de meest significante byte eerst)

De opbouw van een IFD

IFD staat voor Image File Directory, maar zie het gerust als een inhoudsopgave. Het is een platte lijst met tags die elk naar een stukje data verwijzen. Het slimme is dat IFD's naar andere IFD's kunnen wijzen, waardoor er een boomstructuur ontstaat.

De indeling van een IFD

2 bytesAantal entries (het aantal tags)
12 × N bytesDe tag-entries (elk 12 bytes)
4 bytesOffset van de volgende IFD (0 als die er niet is)

Opbouw van een tag-entry (12 bytes)

Tag IDTypeCountValue/Offset
2 bytes2 bytes4 bytes4 bytes

Past de data in 4 bytes, dan staat de waarde meteen in het value-veld. Zo niet, dan bevat dat veld een offset naar de plek waar de data staat.

Tagtypes

TIFF is streng getypeerd. Elke tag zegt niet alleen wat hij bevat, maar ook hoe je de bytes moet lezen. Daarom moet je het typesysteem snappen om TIFF goed te kunnen parsen.

IDNaamGrootteBeschrijving
1BYTE1Unsigned 8-bits integer
2ASCII1Tekst afgesloten met null (8 bits)
3SHORT2Unsigned 16-bits integer
4LONG4Unsigned 32-bits integer
5RATIONAL8Twee LONGs: teller/noemer
6SBYTE1Signed 8-bits integer
7UNDEFINED1Ruwe bytes (binaire data)
8SSHORT2Signed 16-bits integer
9SLONG4Signed 32-bits integer
10SRATIONAL8Twee SLONGs: teller/noemer met teken
11FLOAT4IEEE 32-bits float
12DOUBLE8IEEE 64-bits double
13IFD4Pointer naar een geneste IFD

De regel voor het opslaan van waarden

Is grootte × aantal ≤ 4 bytes, dan staat de waarde rechtstreeks in het value-veld van 4 bytes. Anders bevat dat veld een offset naar de plek in het bestand waar de data staat.

Offsets van IFD's berekenen

Het lastigste aan TIFF parsen is het volgen van de keten van offsets. Alles is relatief ten opzichte van het begin van het bestand, en je springt heel wat heen en weer. Zo werkt het rekenwerk:

// Waar IFD0 staat
IFD0_offset = bytes[4:8] // Uit de TIFF-header
// Waar de volgende IFD staat (bijvoorbeeld IFD1 voor de thumbnail)
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
// Waar een SubIFD staat (EXIF, GPS)
subIFD_offset = tag_value // Uit de pointertag (0x8769, 0x8825)

Belangrijke tags

Tags met beeldgegevens (blijven staan)

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

Tags met metadata (gaan weg)

0x010F:Make (merk van de camera)
0x0110:Model (model van de camera)
0x0132:DateTime
0x013B:Artist
0x8298:Copyright
0x9003:DateTimeOriginal

Pointertags (sub-IFD's)

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

SubIFD's

De hoofd-IFD (IFD0) bevat vaak "pointertags" die naar subdirectory's verwijzen. Zo worden EXIF, GPS en andere metadata in logische groepen ondergebracht en blijft de hoofd-IFD overzichtelijk.

De EXIF-SubIFD

Bevat metadata van de camera: belichting, diafragma, ISO, brandpuntsafstand, flits, witbalans en meer.

De GPS-SubIFD

Bevat locatiegegevens: breedtegraad, lengtegraad, hoogte, tijdstip, satellieten, snelheid en richting. Een groot privacyrisico.

Maker notes

Eigen gegevens van de camerafabrikant. De opbouw verschilt per merk. Kan serienummers, de firmwareversie en eigen instellingen bevatten.

Hoe PicScrub TIFF verwerkt

1

De header parsen

De byte-volgorde bepalen (II/MM) en de eerste IFD opzoeken

2

Een whitelist van tags opstellen

Bepalen welke tags nodig zijn om de afbeelding te tonen

3

De IFD-entries filteren

Metadatatags weghalen en de pointers naar SubIFD's op nul zetten

4

Het bestand opnieuw schrijven

De TIFF opbouwen met schone IFD's en de gekopieerde beeldgegevens

Offsets herberekenen

TIFF-bestanden werken volop met offsets in het bestand. Zodra er metadata weggaat, moet PicScrub al die offsets opnieuw berekenen, anders klopt het bestand niet meer.