Формат TIFF
Tagged Image File Format
Структура заголовка
TIFF це дідусь усіх метаданих у зображеннях. Коли ви бачите дані EXIF усередині JPEG, насправді це структура TIFF, вбудована у файл. Зрозуміти TIFF означає зрозуміти, як улаштована більшість метаданих зображень узагалі.
Формат починається з 8-байтового заголовка, який повідомляє дві найважливіші речі: порядок байтів (Intel чи Motorola) і те, де шукати перший IFD. Далі йде суцільна гонитва за вказівниками.
Структура файлу TIFF
Заголовок TIFF
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
Порядок байтів
49 49 (II)Intel:little-endian (спершу молодший байт)
4D 4D (MM)Motorola:big-endian (спершу старший байт)
Структура IFD
IFD розшифровується як Image File Directory, але уявляйте його як зміст книжки. Це плаский список тегів, кожен з яких вказує на якийсь шматок даних. Найцікавіше те, що IFD можуть вказувати на інші IFD, утворюючи деревоподібну структуру.
Будова IFD
Будова запису тега (12 байтів)
Якщо дані вміщаються в 4 байти, вони зберігаються прямо в полі значення. Якщо ні, поле містить зміщення до самих даних.
Типи тегів
TIFF має сувору типізацію. Кожен тег визначає не лише те, що він містить, а й те, як тлумачити його байти. Саме тому, щоб правильно розібрати TIFF, треба розуміти його систему типів.
| ID | Назва | Розмір | Опис |
|---|---|---|---|
| 1 | BYTE | 1 | Беззнакове 8-бітове ціле |
| 2 | ASCII | 1 | Рядок із нульовим завершувачем (8 біт) |
| 3 | SHORT | 2 | Беззнакове 16-бітове ціле |
| 4 | LONG | 4 | Беззнакове 32-бітове ціле |
| 5 | RATIONAL | 8 | Два LONG: чисельник і знаменник |
| 6 | SBYTE | 1 | Знакове 8-бітове ціле |
| 7 | UNDEFINED | 1 | Сирі байти (двійкові дані) |
| 8 | SSHORT | 2 | Знакове 16-бітове ціле |
| 9 | SLONG | 4 | Знакове 32-бітове ціле |
| 10 | SRATIONAL | 8 | Два SLONG: знакові чисельник і знаменник |
| 11 | FLOAT | 4 | 32-бітове число з рухомою комою IEEE |
| 12 | DOUBLE | 8 | 64-бітове число з рухомою комою IEEE |
| 13 | IFD | 4 | Вказівник на вкладений IFD |
Правило зберігання значень
Якщо розмір × кількість ≤ 4 байтів, значення зберігається прямо в 4-байтовому полі значення. Інакше поле містить зміщення, яке вказує, де у файлі лежать дані.
Обчислення зміщень IFD
Найважче в розборі TIFF це йти ланцюжком зміщень. Усе відлічується від початку файлу, і стрибати доведеться чимало. Ось як рахується ця арифметика:
IFD0_offset = bytes[4:8] // із заголовка TIFF
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
subIFD_offset = tag_value // із тега-вказівника (0x8769, 0x8825)
Важливі теги
Теги даних зображення (зберігаються)
0x0100:ImageWidth0x0101:ImageLength0x0102:BitsPerSample0x0103:Compression0x0111:StripOffsets0x0117:StripByteCountsТеги метаданих (видаляються)
0x010F:Make (виробник камери)0x0110:Model (модель камери)0x0132:DateTime0x013B:Artist0x8298:Copyright0x9003:DateTimeOriginalТеги-вказівники (під-IFD)
0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0xA005:InteroperabilityIFDPointerПід-IFD
Головний IFD (IFD0) часто містить «теги-вказівники», які посилаються на підкаталоги. Саме так EXIF, GPS та інші метадані розкладаються по логічних групах, а головний IFD лишається охайним.
Під-IFD EXIF
Містить метадані камери: витримку, діафрагму, ISO, фокусну відстань, спалах, баланс білого тощо.
Під-IFD GPS
Містить дані геолокації: широту, довготу, висоту, час, супутники, швидкість, напрямок. Серйозна загроза приватності.
Нотатки виробника
Пропрієтарні дані камери. Формат різниться від виробника до виробника. Можуть містити серійні номери, версію прошивки, власні налаштування.
Як PicScrub обробляє TIFF
Розбираємо заголовок
Визначаємо порядок байтів (II/MM) і знаходимо перший IFD
Складаємо білий список тегів
Визначаємо, які теги потрібні для показу зображення
Відсіюємо записи IFD
Видаляємо теги метаданих і обнуляємо вказівники на під-IFD
Перезаписуємо файл
Збираємо TIFF заново з чистими IFD і скопійованими даними зображення
Перерахунок зміщень
Файли TIFF густо всіяні зміщеннями. Коли метадані видаляються, PicScrub мусить перерахувати всі зміщення, щоб файл залишився цілісним.