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

Формат GIF

Graphics Interchange Format

Блокова структура

GIF належить до тих форматів, які пережили відведений їм вік на кілька десятиліть. CompuServe створила його 1987 року, і він досі всюди, насамперед завдяки підтримці анімації.

Формат має блокову структуру, яка на тлі сучасних форматів тішить своєю прямолінійністю. Заголовок, кілька дескрипторів, таблиця кольорів, дані зображення й однобайтовий завершувач, що каже: «кінець».

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

Header
LSD
GCT
Extensions
Image Data
Trailer
Header
6 байт
GIF87a або GIF89a
LSD
7 байт
Дескриптор логічного екрана
GCT
768 байт
Глобальна таблиця кольорів (необовʼязкова)
Extensions
100 байт
Блоки розширень (метадані)
Image Data
Змінна довжина
Дескриптор зображення + дані LZW
Trailer
1 байт
Завершувач 0x3B

Заголовок GIF

Сигнатура GIF
Версія (89a)
Ширина (640)
Висота (480)
Упаковані поля
Індекс кольору тла
Співвідношення сторін пікселя
OffsetHexASCII
0000
4749463839618002E001F70000
GIF89a.......

Чим відрізняються версії

GIF87a

Початкова специфікація. Блоків розширень немає.

GIF89a

Додано розширення, анімацію та прозорість.

Блоки розширень

GIF89a (редакція 1989 року) додала блоки розширень, завдяки яким GIF і навчився анімації. Усі блоки розширень починаються з 0x21, за яким іде байт типу, тож їх легко помітити, коли переглядаєш файл. Одні з них ми хочемо зберегти (тривалість кадрів анімації), інші видалити (коментарі).

Graphic Control Extension (0xF9)

Керує тривалістю кадрів, прозорістю та методом очищення кадру. Передує кожному дескриптору зображення в анімованих GIF. Завжди зберігається.

21 F9 04 [disposal] [delay] [transparent] 00

Comment Extension (0xFE)

Звичайні текстові коментарі. Можуть містити будь-що: автора, дату створення, програму чи особисті нотатки. PicScrub його видаляє.

21 FE [size] [comment data...] 00

Application Extension (0xFF)

Дані конкретних програм. Найважливіше з них: NETSCAPE2.0, що відповідає за зациклення анімації. Може також містити метадані XMP.

21 FF 0B [app identifier] [auth code] [data...] 00

Plain Text Extension (0x01)

Використовується рідко. Малює текст кольорами з таблиці GIF. Сучасні програми його здебільшого ігнорують.

Розширення застосунків

NETSCAPE2.0:зациклення анімації

Визначає, скільки разів повторюється анімований GIF. Значення 0 означає нескінченний цикл.

Початок розширення
Розмір блоку (11)
NETSCAPE2.0
Розмір під-блоку
Ідентифікатор під-блоку
Кількість повторів
Завершувач
OffsetHexASCII
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

1

Перевіряємо заголовок

Шукаємо сигнатуру GIF87a або GIF89a

2

Копіюємо дані заголовка

Залишаємо LSD і глобальну таблицю кольорів без змін

3

Відсіюємо розширення

Залишаємо NETSCAPE2.0 і Graphic Control, прибираємо коментарі та XMP

4

Зберігаємо дані зображення

Копіюємо всі дескриптори зображень, локальні таблиці кольорів і дані LZW без змін

5

Записуємо завершувач

Закінчуємо файл байтом-завершувачем 0x3B

Стиснення LZW

Кілька слів про дані зображення в GIF: вони стиснені алгоритмом LZW, який до 2004 року був запатентований (і наробив чимало галасу в 90-х). PicScrub не торкається стиснених даних узагалі. Ми копіюємо їх байт у байт, тобто без жодних втрат якості.

Чому це важливо

Зберігаючи початкові дані LZW, PicScrub гарантує:

  • • жодних втрат якості (зображення зберігається біт у біт)
  • • швидку обробку (без циклу декодування й кодування)
  • • незмінний розмір даних зображення

Обмеження метаданих у GIF

Добра новина про GIF: він старший за стандарт EXIF, тож перейматися через GPS-координати чи дані про камеру не доводиться. Тут із метаданими все набагато буденніше.

Що може просочитися

Порівняно з JPEG ризики GIF для приватності доволі скромні:

  • • розширення з коментарями (іноді там є нотатки автора)
  • • метадані XMP (рідко, але можливо)
  • • назва програми в блоках застосунків