PicScrub logoPicScrub
Повернутися до форматів

Формат TIFF

Tagged Image File Format

Структура заголовка

TIFF це дідусь усіх метаданих у зображеннях. Коли ви бачите дані EXIF усередині JPEG, насправді це структура TIFF, вбудована у файл. Зрозуміти TIFF означає зрозуміти, як улаштована більшість метаданих зображень узагалі.

Формат починається з 8-байтового заголовка, який повідомляє дві найважливіші речі: порядок байтів (Intel чи Motorola) і те, де шукати перший IFD. Далі йде суцільна гонитва за вказівниками.

Структура файлу TIFF

Header
IFD0
Strip Data
EXIF IFD
GPS IFD
Header
8 байт
Порядок байтів + магічне число + зміщення IFD
IFD0
200 байт
Головний каталог зображення
Strip Data
Змінна довжина
Пікселі зображення
EXIF IFD
500 байт
Підкаталог EXIF
GPS IFD
100 байт
Підкаталог GPS

Заголовок TIFF

Порядок байтів (II = little-endian)
Магічне число (42)
Зміщення першого IFD
OffsetHexASCII
0000
49492A0008000000
II*.....

Порядок байтів

49 49 (II)

Intel:little-endian (спершу молодший байт)

4D 4D (MM)

Motorola:big-endian (спершу старший байт)

Структура IFD

IFD розшифровується як Image File Directory, але уявляйте його як зміст книжки. Це плаский список тегів, кожен з яких вказує на якийсь шматок даних. Найцікавіше те, що IFD можуть вказувати на інші IFD, утворюючи деревоподібну структуру.

Будова IFD

2 байтиКількість записів (тегів)
12 × N байтівЗаписи тегів (по 12 байтів кожен)
4 байтиЗміщення наступного IFD (0, якщо його немає)

Будова запису тега (12 байтів)

Tag IDTypeCountValue/Offset
2 байти2 байти4 байти4 байти

Якщо дані вміщаються в 4 байти, вони зберігаються прямо в полі значення. Якщо ні, поле містить зміщення до самих даних.

Типи тегів

TIFF має сувору типізацію. Кожен тег визначає не лише те, що він містить, а й те, як тлумачити його байти. Саме тому, щоб правильно розібрати TIFF, треба розуміти його систему типів.

IDНазваРозмірОпис
1BYTE1Беззнакове 8-бітове ціле
2ASCII1Рядок із нульовим завершувачем (8 біт)
3SHORT2Беззнакове 16-бітове ціле
4LONG4Беззнакове 32-бітове ціле
5RATIONAL8Два LONG: чисельник і знаменник
6SBYTE1Знакове 8-бітове ціле
7UNDEFINED1Сирі байти (двійкові дані)
8SSHORT2Знакове 16-бітове ціле
9SLONG4Знакове 32-бітове ціле
10SRATIONAL8Два SLONG: знакові чисельник і знаменник
11FLOAT432-бітове число з рухомою комою IEEE
12DOUBLE864-бітове число з рухомою комою IEEE
13IFD4Вказівник на вкладений IFD

Правило зберігання значень

Якщо розмір × кількість ≤ 4 байтів, значення зберігається прямо в 4-байтовому полі значення. Інакше поле містить зміщення, яке вказує, де у файлі лежать дані.

Обчислення зміщень IFD

Найважче в розборі TIFF це йти ланцюжком зміщень. Усе відлічується від початку файлу, і стрибати доведеться чимало. Ось як рахується ця арифметика:

// розташування IFD0
IFD0_offset = bytes[4:8] // із заголовка TIFF
// розташування наступного IFD (напр., IFD1 для мініатюри)
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
// розташування SubIFD (EXIF, GPS)
subIFD_offset = tag_value // із тега-вказівника (0x8769, 0x8825)

Важливі теги

Теги даних зображення (зберігаються)

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

Теги метаданих (видаляються)

0x010F:Make (виробник камери)
0x0110:Model (модель камери)
0x0132:DateTime
0x013B:Artist
0x8298:Copyright
0x9003:DateTimeOriginal

Теги-вказівники (під-IFD)

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

Під-IFD

Головний IFD (IFD0) часто містить «теги-вказівники», які посилаються на підкаталоги. Саме так EXIF, GPS та інші метадані розкладаються по логічних групах, а головний IFD лишається охайним.

Під-IFD EXIF

Містить метадані камери: витримку, діафрагму, ISO, фокусну відстань, спалах, баланс білого тощо.

Під-IFD GPS

Містить дані геолокації: широту, довготу, висоту, час, супутники, швидкість, напрямок. Серйозна загроза приватності.

Нотатки виробника

Пропрієтарні дані камери. Формат різниться від виробника до виробника. Можуть містити серійні номери, версію прошивки, власні налаштування.

Як PicScrub обробляє TIFF

1

Розбираємо заголовок

Визначаємо порядок байтів (II/MM) і знаходимо перший IFD

2

Складаємо білий список тегів

Визначаємо, які теги потрібні для показу зображення

3

Відсіюємо записи IFD

Видаляємо теги метаданих і обнуляємо вказівники на під-IFD

4

Перезаписуємо файл

Збираємо TIFF заново з чистими IFD і скопійованими даними зображення

Перерахунок зміщень

Файли TIFF густо всіяні зміщеннями. Коли метадані видаляються, PicScrub мусить перерахувати всі зміщення, щоб файл залишився цілісним.