Format TIFF
Tagged Image File Format
Budowa nagłówka
TIFF to dziadek wszystkich metadanych w obrazach. Kiedy widzisz dane EXIF w pliku JPEG, tak naprawdę patrzysz na strukturę TIFF osadzoną w środku. Zrozumienie TIFF-a oznacza zrozumienie tego, jak działa większość metadanych w obrazach.
Format zaczyna się od 8-bajtowego nagłówka, który mówi dwie kluczowe rzeczy: jaka jest kolejność bajtów (Intel czy Motorola) i gdzie znaleźć pierwszy IFD. Dalej to już samo podążanie za wskaźnikami.
Struktura pliku TIFF
Nagłówek TIFF
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
Kolejność bajtów
49 49 (II)Intel:little-endian (najmniej znaczący bajt pierwszy)
4D 4D (MM)Motorola:big-endian (najbardziej znaczący bajt pierwszy)
Struktura IFD
IFD to skrót od Image File Directory, ale najłatwiej myśleć o nim jak o spisie treści. To płaska lista tagów, z których każdy wskazuje na jakiś fragment danych. Sprytne jest to, że IFD mogą wskazywać na inne IFD, tworząc strukturę drzewa.
Układ IFD
Budowa wpisu tagu (12 bajtów)
Jeśli dane mieszczą się w 4 bajtach, zapisuje się je wprost w polu wartości. W przeciwnym razie pole zawiera offset do danych.
Typy tagów
TIFF jest mocno typowany. Każdy tag określa nie tylko to, co zawiera, ale też jak interpretować bajty. Dlatego bez znajomości systemu typów nie da się poprawnie przeanalizować pliku TIFF.
| ID | Nazwa | Rozmiar | Opis |
|---|---|---|---|
| 1 | BYTE | 1 | 8-bitowa liczba bez znaku |
| 2 | ASCII | 1 | Tekst zakończony bajtem zerowym (8-bitowy) |
| 3 | SHORT | 2 | 16-bitowa liczba bez znaku |
| 4 | LONG | 4 | 32-bitowa liczba bez znaku |
| 5 | RATIONAL | 8 | Dwa LONG-i: licznik i mianownik |
| 6 | SBYTE | 1 | 8-bitowa liczba ze znakiem |
| 7 | UNDEFINED | 1 | Surowe bajty (dane binarne) |
| 8 | SSHORT | 2 | 16-bitowa liczba ze znakiem |
| 9 | SLONG | 4 | 32-bitowa liczba ze znakiem |
| 10 | SRATIONAL | 8 | Dwa SLONG-i: licznik i mianownik ze znakiem |
| 11 | FLOAT | 4 | 32-bitowa liczba zmiennoprzecinkowa IEEE |
| 12 | DOUBLE | 8 | 64-bitowa liczba zmiennoprzecinkowa IEEE |
| 13 | IFD | 4 | Wskaźnik na zagnieżdżony IFD |
Zasada zapisu wartości
Jeśli rozmiar × liczba ≤ 4 bajty, wartość zapisuje się wprost w 4-bajtowym polu wartości. W przeciwnym razie pole zawiera offset wskazujący, gdzie w pliku leżą dane.
Obliczanie offsetów IFD
Najtrudniejsze w analizie TIFF-a jest podążanie za łańcuchem offsetów. Wszystko liczy się względem początku pliku i sporo się przy tym skacze. Oto jak wygląda ta arytmetyka:
IFD0_offset = bytes[4:8] // Z nagłówka TIFF
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
subIFD_offset = tag_value // Z tagu wskaźnikowego (0x8769, 0x8825)
Najważniejsze tagi
Tagi danych obrazu (zostają)
0x0100:ImageWidth0x0101:ImageLength0x0102:BitsPerSample0x0103:Compression0x0111:StripOffsets0x0117:StripByteCountsTagi metadanych (usuwane)
0x010F:Make (producent aparatu)0x0110:Model (model aparatu)0x0132:DateTime0x013B:Artist0x8298:Copyright0x9003:DateTimeOriginalTagi wskaźnikowe (pod-IFD)
0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0xA005:InteroperabilityIFDPointerPod-IFD
Główny IFD (IFD0) często zawiera „tagi wskaźnikowe”, które odsyłają do podkatalogów. Dzięki temu EXIF, GPS i inne metadane są ułożone w logiczne grupy, a główny IFD pozostaje czytelny.
Pod-IFD EXIF
Zawiera metadane aparatu: ekspozycję, przysłonę, ISO, ogniskową, lampę błyskową, balans bieli i wiele innych.
Pod-IFD GPS
Zawiera dane o lokalizacji: szerokość, długość, wysokość, czas, liczbę satelitów, prędkość i kierunek. Poważne zagrożenie dla prywatności.
Maker Notes
Zamknięte dane producenta aparatu. Format różni się u każdego z nich. Mogą zawierać numery seryjne, wersję firmware i własne ustawienia.
Jak PicScrub przetwarza pliki TIFF
Analiza nagłówka
Ustalenie kolejności bajtów (II/MM) i znalezienie pierwszego IFD
Zbudowanie białej listy tagów
Wskazanie tagów niezbędnych do wyświetlenia obrazu
Odfiltrowanie wpisów IFD
Usunięcie tagów z metadanymi i wyzerowanie wskaźników do pod-IFD
Zapis pliku na nowo
Złożenie pliku TIFF z czystymi IFD i skopiowanymi danymi obrazu
Przeliczanie offsetów
Pliki TIFF opierają się w całości na offsetach. Kiedy metadane znikają, PicScrub musi przeliczyć wszystkie offsety, żeby plik pozostał poprawny.