Домашняя страничка Чьезо

Краткое описание формата GIF


GIF - один из самых распространенных и популярных в интернете форматов изображений. Думаю, что не ошибусь, если предположу, что общее число всех файлов GIF в мире исчисляется миллиардами. Столь широкое распространение GIF во многом определяется особенностями его формата. Я попытался более наглядно представить внутреннее строение файлов GIF, чем это сделано в сухом официальном описании формата. Все картинки на этой странице - в формате GIF, так что, можно сказать, что формат GIF иллюстрирует сам себя.

История GIF

В 1977 году два израильских специалиста по теории информации, Яков Зив и Авраам Лемпель, написали универсальный алгоритм сжатия данных, который получил название LZ (Lempel-Ziv). Позже, в 1984 году, Терри Уэлч, сотрудник фирмы Unisуs (Юнaйсис), изменил этот алгоритм, немного улучшив степень сжатия. Этот метод стал называться LZW (Lempel-Ziv-Welch).

Через семь лет, в 1987 году, фирма CompuServe (Компьюсерв) использовала алгоритм LZW при создании нового формата изображений, предназначенного специально для обмена графикой между компьютерами - GIF (Graphic Interchange Format). С развитием интернета, когда потребность в компактных, быстро передающихся по сети изображениях многократно возросла, формат GIF стал необычайно популярен, и соперничать с ним сейчас может лишь один формат - JPEG (Joint Photographic Expert Group), ориентированный на изображения фотографического качества, в то время как GIF обладает такими недоступными для JPEG свойствами, как прозрачный фон и анимация. В 1989 году CompuServe выпустила расширенную версию формата - GIF89a. В нее и были добавлены эти новые возможности.

В 1995 году фирма Unisуs, владеющая патентом на метод LZW, неожиданно решила, что на нем можно заработать, и запретила распространение программ, использующих сжатие LZW, без лицензии. Теперь, чтобы продавать или даже бесплатно распространять программы, создающие или показывающие изображения GIF, нужно было платить за лицензию по меньшей мере 5000 долларов. Дело доходило до того, что деньги требовали даже с владельцев сайтов, где изображения GIF создавались динамически. Программисты стали искать обходные пути. Появились альтернативные форматы, среди которых самым известным стал PNG ("Пинг", Portable Network Graphic). По некоторым параметрам он превосходит GIF, а с появлением анимированной версии (MNG) он стал буквально наступать формату GIF на пятки. И не удивительно, ведь в нем тоже применен один из вариантов метода сжатия Лемпеля-Зива - LZ77.

К счастью, 20 июня 2003 года срок действия основного патента Unisуs на метод LZW в США истек, а патенты в Европе и Канаде были действительны лишь до 7 июля 2004 года, что, возможно, даст формату GIF шанс не потерять завоеванные им за прошлые годы позиции.

Некоторые общие данные

Структура

Файлы формата GIF имеют блочную структуру. Это значит, что они состоят из отдельных блоков, которые в большинстве случаев никак не связаны друг с другом. Программы, не распознающие некоторые типы блоков, могут просто пропускать их - для этого у каждого нестандартного блока в заголовке указан его размер. Идущие один за другим блоки графики (картинки) составляют анимацию. Они сменяются на экране и создают иллюзию движения. До или после них (или даже между ними) в файле могут находиться другие блоки:

  1. Комментарии. Скрытый текст, его можно увидеть лишь с помощью специальных программ - например, GIF-аниматоров, таких, как Ulead GIF Animator.
  2. Простой текст. Строки символов с ограниченными возможностями форматирования. В настоящее время не используется.
  3. Блоки управления графикой, задающие параметры вывода отдельных картинок.
  4. Глобальная и локальные цветовые палитры, определяющие, какие именно цвета будут у картинок.
  5. Особые блоки, которые могут использоваться лишь теми программами, которые знают об их существовании и назначении - например, блок Netscape, задающий число циклов анимации. Без него анимация после загрузки страницы срабатывает всего один раз. А в блоке Pianygif хранятся названия отдельных картинок для облегчения их редактирования.

Минимально необходимый набор блоков - простейший неанимированный GIF:

Расположение блоков внутри простого файла GIF

Поводите мышкой над блоками для вывода их названий (работает не на всех браузерах)

Зеленый Текстовые константы
Желтый Переменные
Голубой Байты с упакованными в них полями и флагами
Розовый Шестнадцатиричные константы
Серый Блоки данных переменной длины
Белый Зарезервированные байты или биты

Дескриптор логического экрана

Расположение данных в дескрипторе логического экрана

В начале каждого файла GIF находится заголовок. Поскольку сразу за ним идет дескриптор логического экрана, я считаю заголовок его частью. Он состоит из текста "GIF87a" или "GIF89a", в зависимости от версии.

Дескриптор - это просто "описатель" или "описание". Логический экран - область реального экрана компьютера, куда выводятся все картинки данного файла GIF. Они могут иметь разный размер и занимать разное положение на логическом экране

W, H - ширина и высота логического экрана в пикселах, то есть размер области вывода картинок. Изображения, не умещающиеся на логическом экране, должны обрезаться по его размеру.

BG - номер цвета фона. Если в файле присутствует глобальная палитра, то этим цветом заливаются области фона, где нет картинок. Но если при этом в самом первом, еще до всех картинок, расширении управления графикой включена прозрачность, то этот цвет считается прозрачным.

R - соотношение сторон исходного изображения. В версии GIF87a это поле зарезервировано, и здесь стоят нули. Насколько мне известно, этот параметр никогда и никем не используется. Предполагалось, что пиксел экрана может быть и не квадратным, как было в старых компьютерах и как сейчас бывает при некоторых режимах DOS, и что для вывода таких изображений необходимо изменять разрешение экрана либо растягивать изображение так, чтобы оно выглядело более реалистичным.

CT - наличие глобальной палитры. Если этот флаг установлен, то сразу после дескриптора глобального экрана должна начинаться глобальная палитра. Размер палитры определяется полем Size.

Color - цветовое разрешение исходной картинки. Число битов, приходящееся на каждый из трех основных цветов. Если файл GIF создан напрямую из полноцветного изображения, то Color будет равен 7, а если из уже индексированного, то его значение будет зависеть от глубины цвета этой индексированной картинки, причем весьма приблизительно. Например, если файл создан на основе 16-цветной картинки, то Color должен быть равен 1, и исходная палитра предполагается 64-цветной.

Глубина цвета исходного изображения Color
Число цветов Бит/пиксел Бит/цвет
16777216 24 8 7
2097152 21 7 6
262144 18 6 5
32768 15 5 4
4096 12 4 3
512 9 3 2
64 6 2 1
8 3 1 0

SF - флаг сортировки палитры. В версии GIF87a этот бит зарезервирован, и здесь стоит ноль. Указывает, сортирована ли палитра по значимости цветов, когда первыми идут наиболее значимые цвета. Значимость цвета определяется тем, какую площадь изображения он занимает по отношению к другим цветам.

Size - размер палитры и число цветов картинки. Если флаг глобальной палитры CT сброшен, то здесь должны стоять нули.

Size Число цветов Размер палитры, байт
7 256 768
6 128 384
5 64 192
4 32 96
3 16 48
2 8 24
1 4 12
0 2 6

Глобальная палитра

Расположение данных в глобальной палитре

Изображения, хранящиеся в файле GIF, индексированы. Картинки состоят не из полноцветных пикселов, а из номеров цветов, а сами цвета находятся в палитре. Палитра составлена из триад, в свою очередь состоящих из байтов красного (R), зеленого (G) и синего (B) основных цветов. Из всего многообразия цветов (современные компьютеры и мониторы могут показывать на экране до 16 миллионов цветов) используется всего лишь от 2 до 256. Сведение числа цветов к минимуму без значительного ухудшения качества изображения и без потери информации - сродни искусству, и автоматизации поддается плохо. Многие графические редакторы - такие как Adobe Photoshop, например - позволяют интерактивно выбрать наилучший вариант индексации картинки "на глаз".

Если она есть, глобальная палитра идет сразу за дескриптором логического экрана. Наличие палитры определяется флагом CT дескриптора, а размер - полем Size. Глобальная палитра действует на все картинки, у которых нет своей локальной палитры. В том аварийном случае, если в файле нет ни глобальной, ни локальных палитр, программа просмотра может поступать по своему усмотрению - например, использовать системную палитру. Однако рекомендуется, чтобы первые два цвета в ней были черным и белым, чтобы в любом случае на экран вывелось хоть что-то.

Дескриптор изображения

Расположение данных в дескрипторе изображения

Действует на следующий за ним графический блок (картинку). Без него картинка выводится не будет, так что его можно считать неотъемлемой частью графического блока. Между дескриптором и блоком графики может находиться только локальная палитра.

W, H - ширина и высота картинки в пикселах.

Left, Top - положение картинки на логическом экране.

CT - наличие локальной палитры. Если этот флаг установлен, то сразу после дескриптора изображения должна начинаться локальная палитра. Размер палитры определяется полем Size.

I - чересстрочная или обычная развертка картинки при выводе на экран. При скачивании картинки из интернета чересстрочная развертка позволяет быстрее получить первое впечатление об изображении, хотя оно будет еще недостатчно четким. Однако файлы с чересстрочной разверткой немного больше по размеру, а при просмотре в отключенном режиме такие картинки могут выводиться медленней.

SF - флаг сортировки палитры. В версии GIF87a этот бит зарезервирован, и здесь стоит ноль. Указывает, сортирована ли палитра по значимости цветов, когда первыми идут наиболее значимые цвета. Значимость цвета определяется тем, какую площадь изображения он занимает по отношению к другим цветам.

Size - размер локальной палитры и число цветов картинки (см. выше). Если флаг локальной палитры CT сброшен, то здесь должны стоять нули.

Локальная палитра

Расположение данных в локальной палитре

Если она есть, должна идти сразу за дескриптором изображения Наличие палитры определяется флагом CT дескриптора, а размер - полем Size. Действует она только на следующий сразу за ней графический блок (картинку).

Для уменьшения размера файла лучше ограничиться одной глобальной палитрой, не прибегая к локальным - особенно, если речь идет о многоцветных картинках. Максимальный размер палитры при 256 цветах - 768 байт, а если умножить на число картинок в анимации, то сумма набегает солидная.

Графический блок

Расположение данных в блоке графики

Картинка, сжатая по методу LZW. Она разбита на отдельные субблоки по 255 байт. Число картинок в файле, как и размер каждой картинки, ничем не ограниченны. Анимированным GIF становится в том случае, если в нем больше одной картинки. Тогда при просмотре файла в браузере автоматически включается анимация. Про метод сжатия LZW достаточно подробно рассказано на моей страничке Сжатие по методу LZW.

MC - Начальный размер LZW-кода. Равен глубине цвета картинки, за исключением двухцветных, когда MC равен не 1, а 2.

Число цветов Глубина цвета, бит/пиксел MC Размер LZW-кода
256 8 8 9
128 7 7 8
64 6 6 7
32 5 5 6
16 4 4 5
8 3 3 4
4 2 2 3
2 1 2 3

S - размер субблока данных, не включая сам байт S. У всех субблоков, кроме последнего, размер должен быть равен 255 байтам. У последнего субблока (или если он вообще один) размер может быть любым - от 1 до 255 байт.

Расширение управления графикой

Расположение данных в расширении управления графикой

Введено в версии GIF89a. Действует на первый же следующий за ним графический блок (картинку). Между ним и блоком графики могут быть вставлены другие блоки (например, комментарий) - это его работе не мешает.

Delay - время задержки, в 1/100 сек. Время, в течение которого данная картинка остается на экране. Минимальное значение - 1/100 секунды, максимальное - примерно 655 секунд. Таймер начинает отсчет лишь после того, как картинка выведена на экран, поэтому у разных программ просмотра время задержки может существенно различаться. Например, если попытаться сделать анимированный GIF - часы, то они могут, в зависимости от браузера, за минуту спешить или отставать более чем на секунду.

Tr - номер прозрачного цвета. Если есть локальная палитра, это номер цвета в ней, если же локальной палитры нет, то это номер цвета в глобальной палитре.

Disp - способ замены картинки после показа:

Disp Способ замены Примечание
0 На усмотрение браузера Обычно результат такой же, как при 1
1 Оставить как есть Наложение следующей картинки поверх данной
2 Восстановить цвет фона Стирание картинки перед выводом следующей
3 Восстановить предыдущую картинку Поддерживается не всеми программами просмотра,
использовать не рекомендуется
4...7   Зарезервированы

UI - ожидается реакция пользователя. Еще один никогда и никем не используемый параметр. Предполагалось, что если этот флаг установлен, то после вывода данной картинки для продолжения анимации и вывода следующих необходимо, например, щелкнуть кнопкой мышки.

TF - флаг прозрачности. Если он установлен, данная картинка выводится с прозрачным фоном, цвет которого определяется параметром Tr.

Расширение простого текста

Расположение данных в расширении простого текста

Введено в версии GIF89a. Предполагалось, что вместе с картинками будут передаваться текстовые сообщения, появляющиеся на экране в паузах между ними или поверх них. Так как символы более 0xF7 не выводятся (заменяются на пробелы), это делает расширение непригодным для вывода символов кириллицы (русских букв). В настоящее время все тексты в файлах GIF идут в виде картинок, так что это расширение, насколько мне известно, никогда и никем не используется.

Left, Top - положение области текста на логическом экране.

W, H - размер области текста. Строки, выходящие за ее рамки, обрезаются. Переводы строки должны быть заранее вставлены в текст.

cW, cH - размер символов. Рекомендуется использовать значения 8х8 или 8х16 пикселов, что в настоящее время годится лишь для DOS.

FG - номер цвета текста.

BG - номер цвета фона. Этим цветом заливаются области фона, где нет текста.

S - размер субблока данных, не включая сам байт S. У всех субблоков, кроме последнего, размер должен быть равен 255 байтам. У последнего субблока (или если он вообще один) размер может быть любым - от 1 до 255 байт.

Расширение комментария

Расположение данных в расширении комментария

Введено в версии GIF89a. В основном сюда записывают данные об авторских правах создателей файла GIF - и людей, и программ. Самый длинный текст можно ожидать в том случае, если программа бесплатная или условно-бесплатная. Длина текста ничем не ограниченна. В принципе сюда можно записать даже такую мегабайтовую книгу, как "Моби Дик".

S - размер субблока данных, не включая сам байт S. У всех субблоков, кроме последнего, размер должен быть равен 255 байтам. У последнего субблока (или если он вообще один) размер может быть любым - от 1 до 255 байт.

Расширение приложения

Расположение данных в расширении приложения

Введено в версии GIF89a. Расширения приложения - это специальные блоки данных - не картинки и не текст. С ними могут работать только те программы (приложения), для которых они предназначены. Наибольшую известность приобрело расширение приложения Netscape, описываемое ниже.

ID - идентификатор приложения. Текст из 8 символов, по которому программа просмотра определяет, сможет ли она прочесть данные, и какого они типа.

Code - код проверки идентификатора. Предполагалось, что программа, создавшая GIF, будет синтезировать двоичный код для подтверждения своих прав на данное расширение. На деле здесь тоже находится текст из 3 символов.

S - размер субблока данных, не включая сам байт S. У всех субблоков, кроме последнего, размер должен быть равен 255 байтам. У последнего субблока (или если он вообще один) размер может быть любым - от 1 до 255 байт.

Расширение приложения Netscape

Расположение данных в расширении приложения Netscape

Должно идти сразу за глобальной палитрой (если она есть) или за дескриптом логического экрана (если ее нет). Единственная цель данного расширения - установить число циклов анимации. Как можно догадаться, первым приложением, которое могло использовать эту информацию, был браузер Netscape 2.0. Сейчас это расширение присутствует почти во всех файлах GIF, где есть анимация.

? - здесь стоит 0x01, но что это означает, мне неизвестно. Возможно, первоначально этот байт предполагалось использовать, но затем он оказался ненужным.

Loop - Число циклов анимации, от 0 до 65535. Здесь есть некоторые странности. Во-первых, без расширения Netscape цикл анимации срабатывает, но только один раз. Если же вставить расширение Netscape в файл и установить Loop = 1, то цикл будет прокручиваться дважды, как и при Loop = 2. А при Loop = 0 анимация крутится бесконечно, так что ее отключение, для того, чтобы выводилась только одна первая картинка, в любом случае оказывается невозможным.

Расширение приложения Pianygif

Расположение данных в расширении приложения Pianygif

Совершенно случайно я обнаружил еще одно расширение приложения. Судя по его названию, должна быть программа с названием "Pianygif", но я таковой не обнаружил - возможно, она уже давно канула в Лету. Однако польза от этого расширения есть. В нем хранятся названия отдельных графических блоков (или "слоев") картинки, что помогает различать их при редактировании анимации. Так, например, это расширение использует редактор GIF-анимации Ulead GIF Animator, входящий в набор Ulead Web Razor.

Названия хранятся разбитыми на субблоки данных, которые, после объединения и удаления байтов размера представляют из себя одну строку неограниченной длины, где названия отделены друг от друга разделителем 0x01. Последовательность названий соответствует последовательности картинок в файле. Заканчивается строка терминатором 0x0101 или 0x010F. От чего зависит выбор терминатора, определить пока не удалось.

S - размер субблока данных, не включая сам байт S. У всех субблоков, кроме последнего, размер должен быть равен 255 байтам. У последнего субблока (или если он вообще один) размер может быть любым - от 1 до 255 байт.

Заключение

Может показаться, что формат GIF со своими 256 цветами уже окончательно устарел, однако в сравнении с другими техниками вывода изображений он даже может в чем-то и выигрывать.

Например, применение для создания анимированных кнопок и баннеров вместо картинок GIF техники Flash предполагает, что на каждом браузере установлен плагин Flash или элемент ActiveX Flash нужной версии. Это может в отдельных случаях привести к тому, что пользователи не только не смогут увидеть рекламу, но и вообще не смогут попасть на данный сайт, в то время как поддержка GIF изначально встроена во все браузеры, начиная с самых первых версий.

Завоевывающий все большую популярность формат PNG, при всех своих неоспоримых достоинствах (полноцветная картинка, прозрачность с альфа-каналом), не может обеспечивать столь сильного сжатия малоцветных изображений, не говоря уже об анимации. Его анимированная модификация MNG, насколько мне известно, пока не поддерживается ни одним браузером.

Другие новые форматы - такие, как JPEG 2000 - ориентированы в основном на фотографические изображения и не составляют серьезной конкуренции формату GIF, тем более что пройдет еще немало времени, пока браузеры во всем мире обзаведутся поддержкой этих новых форматов. В настоящее же время GIF, наряду с JPEG, остается одним из двух основных форматов изображений, используемых в интернете, и, скорее всего, будет служитть нам еще долго.

Источники:


Последнее обновление было 16 августа 2005