PicScrub logoPicScrub
Wróć do formatów

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

Header
IFD0
Strip Data
EXIF IFD
GPS IFD
Header
8 B
Kolejność bajtów + liczba magiczna + offset IFD
IFD0
200 B
Główny katalog obrazu
Strip Data
Zmienna długość
Dane pikseli obrazu
EXIF IFD
500 B
Podkatalog EXIF
GPS IFD
100 B
Podkatalog GPS

Nagłówek TIFF

Kolejność bajtów (II = little-endian)
Liczba magiczna (42)
Offset pierwszego IFD
OffsetHexASCII
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

2 bajtyLiczba wpisów (liczba tagów)
12 × N bajtówWpisy tagów (po 12 bajtów każdy)
4 bajtyOffset następnego IFD (0, jeśli go nie ma)

Budowa wpisu tagu (12 bajtów)

ID taguTypLiczbaWartość/offset
2 bajty2 bajty4 bajty4 bajty

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.

IDNazwaRozmiarOpis
1BYTE18-bitowa liczba bez znaku
2ASCII1Tekst zakończony bajtem zerowym (8-bitowy)
3SHORT216-bitowa liczba bez znaku
4LONG432-bitowa liczba bez znaku
5RATIONAL8Dwa LONG-i: licznik i mianownik
6SBYTE18-bitowa liczba ze znakiem
7UNDEFINED1Surowe bajty (dane binarne)
8SSHORT216-bitowa liczba ze znakiem
9SLONG432-bitowa liczba ze znakiem
10SRATIONAL8Dwa SLONG-i: licznik i mianownik ze znakiem
11FLOAT432-bitowa liczba zmiennoprzecinkowa IEEE
12DOUBLE864-bitowa liczba zmiennoprzecinkowa IEEE
13IFD4Wskaź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:

// Położenie IFD0
IFD0_offset = bytes[4:8] // Z nagłówka TIFF
// Położenie następnego IFD (np. IFD1 z miniaturą)
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
// Położenie SubIFD (EXIF, GPS)
subIFD_offset = tag_value // Z tagu wskaźnikowego (0x8769, 0x8825)

Najważniejsze tagi

Tagi danych obrazu (zostają)

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

Tagi metadanych (usuwane)

0x010F:Make (producent aparatu)
0x0110:Model (model aparatu)
0x0132:DateTime
0x013B:Artist
0x8298:Copyright
0x9003:DateTimeOriginal

Tagi wskaźnikowe (pod-IFD)

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

Pod-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

1

Analiza nagłówka

Ustalenie kolejności bajtów (II/MM) i znalezienie pierwszego IFD

2

Zbudowanie białej listy tagów

Wskazanie tagów niezbędnych do wyświetlenia obrazu

3

Odfiltrowanie wpisów IFD

Usunięcie tagów z metadanymi i wyzerowanie wskaźników do pod-IFD

4

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.