Формат GIF
Graphics Interchange Format
Блокова структура
GIF належить до тих форматів, які пережили відведений їм вік на кілька десятиліть. CompuServe створила його 1987 року, і він досі всюди, насамперед завдяки підтримці анімації.
Формат має блокову структуру, яка на тлі сучасних форматів тішить своєю прямолінійністю. Заголовок, кілька дескрипторів, таблиця кольорів, дані зображення й однобайтовий завершувач, що каже: «кінець».
Структура файлу GIF
Заголовок GIF
| Offset | Hex | ASCII | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 4749463839618002E001F70000 | GIF89a....... | ||||||||||||
Чим відрізняються версії
Початкова специфікація. Блоків розширень немає.
Додано розширення, анімацію та прозорість.
Блоки розширень
GIF89a (редакція 1989 року) додала блоки розширень, завдяки яким GIF і навчився анімації. Усі блоки розширень починаються з 0x21, за яким іде байт типу, тож їх легко помітити, коли переглядаєш файл. Одні з них ми хочемо зберегти (тривалість кадрів анімації), інші видалити (коментарі).
Graphic Control Extension (0xF9)
Керує тривалістю кадрів, прозорістю та методом очищення кадру. Передує кожному дескриптору зображення в анімованих GIF. Завжди зберігається.
Comment Extension (0xFE)
Звичайні текстові коментарі. Можуть містити будь-що: автора, дату створення, програму чи особисті нотатки. PicScrub його видаляє.
Application Extension (0xFF)
Дані конкретних програм. Найважливіше з них: NETSCAPE2.0, що відповідає за зациклення анімації. Може також містити метадані XMP.
Plain Text Extension (0x01)
Використовується рідко. Малює текст кольорами з таблиці GIF. Сучасні програми його здебільшого ігнорують.
Розширення застосунків
NETSCAPE2.0:зациклення анімації
Визначає, скільки разів повторюється анімований GIF. Значення 0 означає нескінченний цикл.
| Offset | Hex | ASCII | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 21FF0B4E45545343415045322E300301000000 | !..NETSCAPE2.0..... | ||||||||||||||||||
PicScrub зберігає NETSCAPE2.0, щоб анімація поводилася як раніше.
XMP Data:Extensible Metadata Platform
Ідентифікатор застосунку: XMP DataXMP. Містить повні метадані XMP/RDF у форматі XML.
PicScrub видаляє розширення застосунків з XMP.
Збереження анімації
Складність із GIF у тому, щоб відрізнити дані анімації (їх треба зберегти) від метаданих (їх треба видалити). І те, і те живе в блоках розширень, тож просто викинути всі розширення не можна.
Зберігається заради анімації
- • кількість повторів NETSCAPE2.0
- • розширення Graphic Control
- • затримки між кадрами
- • методи очищення кадру
- • індекси прозорості
- • локальні таблиці кольорів
Видаляється
- • розширення з коментарями
- • блоки застосунків з XMP
- • невідомі блоки застосунків
- • розширення Plain Text
Як PicScrub обробляє GIF
Перевіряємо заголовок
Шукаємо сигнатуру GIF87a або GIF89a
Копіюємо дані заголовка
Залишаємо LSD і глобальну таблицю кольорів без змін
Відсіюємо розширення
Залишаємо NETSCAPE2.0 і Graphic Control, прибираємо коментарі та XMP
Зберігаємо дані зображення
Копіюємо всі дескриптори зображень, локальні таблиці кольорів і дані LZW без змін
Записуємо завершувач
Закінчуємо файл байтом-завершувачем 0x3B
Стиснення LZW
Кілька слів про дані зображення в GIF: вони стиснені алгоритмом LZW, який до 2004 року був запатентований (і наробив чимало галасу в 90-х). PicScrub не торкається стиснених даних узагалі. Ми копіюємо їх байт у байт, тобто без жодних втрат якості.
Чому це важливо
Зберігаючи початкові дані LZW, PicScrub гарантує:
- • жодних втрат якості (зображення зберігається біт у біт)
- • швидку обробку (без циклу декодування й кодування)
- • незмінний розмір даних зображення
Обмеження метаданих у GIF
Добра новина про GIF: він старший за стандарт EXIF, тож перейматися через GPS-координати чи дані про камеру не доводиться. Тут із метаданими все набагато буденніше.
Що може просочитися
Порівняно з JPEG ризики GIF для приватності доволі скромні:
- • розширення з коментарями (іноді там є нотатки автора)
- • метадані XMP (рідко, але можливо)
- • назва програми в блоках застосунків