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
De TIFF-header
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 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
Opbouw van een tag-entry (12 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.
| ID | Naam | Grootte | Beschrijving |
|---|---|---|---|
| 1 | BYTE | 1 | Unsigned 8-bits integer |
| 2 | ASCII | 1 | Tekst afgesloten met null (8 bits) |
| 3 | SHORT | 2 | Unsigned 16-bits integer |
| 4 | LONG | 4 | Unsigned 32-bits integer |
| 5 | RATIONAL | 8 | Twee LONGs: teller/noemer |
| 6 | SBYTE | 1 | Signed 8-bits integer |
| 7 | UNDEFINED | 1 | Ruwe bytes (binaire data) |
| 8 | SSHORT | 2 | Signed 16-bits integer |
| 9 | SLONG | 4 | Signed 32-bits integer |
| 10 | SRATIONAL | 8 | Twee SLONGs: teller/noemer met teken |
| 11 | FLOAT | 4 | IEEE 32-bits float |
| 12 | DOUBLE | 8 | IEEE 64-bits double |
| 13 | IFD | 4 | Pointer 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:
IFD0_offset = bytes[4:8] // Uit de TIFF-header
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
subIFD_offset = tag_value // Uit de pointertag (0x8769, 0x8825)
Belangrijke tags
Tags met beeldgegevens (blijven staan)
0x0100:ImageWidth0x0101:ImageLength0x0102:BitsPerSample0x0103:Compression0x0111:StripOffsets0x0117:StripByteCountsTags met metadata (gaan weg)
0x010F:Make (merk van de camera)0x0110:Model (model van de camera)0x0132:DateTime0x013B:Artist0x8298:Copyright0x9003:DateTimeOriginalPointertags (sub-IFD's)
0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0xA005:InteroperabilityIFDPointerSubIFD'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
De header parsen
De byte-volgorde bepalen (II/MM) en de eerste IFD opzoeken
Een whitelist van tags opstellen
Bepalen welke tags nodig zijn om de afbeelding te tonen
De IFD-entries filteren
Metadatatags weghalen en de pointers naar SubIFD's op nul zetten
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.