G I F (tm)
Graphics Interchange Format (tm)
(Формат графического обмена)

Стандартное определение механизма
для запоминания и передачи
растровой графической информации

June 15, 1987
(c) CompuServe Incorporated, 1987
All rights reserved

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

GIF и 'Graphics Interchange Format'
являются торговой маркой CompuServe, Incorporated.
an H&R Block Company 5000 Arlington Centre Blvd.
Columbus, Ohio 43220
(614) 457-8600

Перевод с английского языка выполнен А.С.Самотохиным
Институт прикладной математики АН СССР
Москва, ноябрь 1990 г.

Описание формата графического обмена (GIF)

Оглавление

ВВЕДЕНИЕ


    'GIF' (tm) - это стандарт фирмы CompuServe для определения растровых цветных изображений. Этот формат позволяет высвечивать на различном оборудовании графические высококачественные изображения с большим разрешением и подразумевает механизм обмена и высвечивания изображений. Описанный в настоящем документе формат изображений был разработан для поддержки настоящей и будущей технологии обработки изображений и будет в дальнейшем служить основой для будущих графических продуктов CompuServe.

    Главная задача настоящего документа состоит в том, чтобы снабдить программистов необходимой технической информацией для написания декодеров и кодировщиков GIF. Поэтому в документе используется терминология связанная с общими вопросами графики и программирования.

    Первый раздел настоящего документа описывает формат данных GIF и его компоненты в приложении к декодерам GIF, вне зависимости от того являются ли они отдельной программой или частью пакета связи. Приложение B относится к декодерам являющимися частью пакетов связи и описывает протокол, необходимый для входа и существования режима GIF и отвечает на ряд специфических вопросов. Глоссарий в приложении A определяет некоторые термины, использованные в документе. Приложение C дает подробное объяснение того, как сами графические изображения пакуются в виде последовательности байтов.

Определение формата данных GIF
ОБЩИЙ ФОРМАТ ФАЙЛА


+-------------------------------+
| +---------------------------+ |
| |     Идентификатор GIF     | |
| +---------------------------+ |
| +---------------------------+ |
| |      Дескриптор экрана    | |
| +---------------------------+ |
| +---------------------------+ |
| | Глобальная таблица цветов | |
| +---------------------------+ |
. . .                       . . .
| +---------------------------+ |    ---+
| |   Дескирптор изображения  | |       |
| +---------------------------+ |       |
| +---------------------------+ |       |
| | Локальная таблица цветов  | |       |--  Повторяется
| +---------------------------+ |       |    от 1 до n раз
| +---------------------------+ |       |
| |      Растровые данные     | |       |
| +---------------------------+ |    ---+
. . .                       . . .
|-  Терминатор  GIF            -|
+-------------------------------+

ИДЕНТИФИКАТОР GIF


    Наличие в начале файла специальной "подписи" указывает, что последующие данные являются действительно потоком данных изображения в формате GIF. Эта "подпись" состоит из следующих шести символов:

             G I F 8 7 a
Три последних символа '87a' могут рассматриваться как номер версии для данного конкретного определения GIF и будут использоваться в дальнейшем в качестве ссылки на документ с описанием GIF в зависимости от номера версии.

ДЕСКРИПТОР ЭКРАНА


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

              биты
 7 6 5 4 3 2 1 0  Номер байта
+---------------+
|               |  1
|-Ширина экрана-|      Ширина растра в пикселах (сначала LSB)
|               |  2
|---------------|
|               |  3
|-Высота экрана-|      Высота растра в пикселах (сначала LSB)
|               |  4
|---------------|      M = 1, За дескриптором следует глобальная
| |     | |     |             таблица цветов
|M|  cr |0|pixel|  5   cr+1 = число битов цветового разрешения
|---------------|      pixel+1 = число бит/пиксел в изображении
|   background  |  6   фон = цветовой индекс фона экрана
|---------------|         (цвет определяется из глобальной таблицы
|0 0 0 0 0 0 0 0|  7        цветов или из таблицы по умолчанию)
+---------------+
    Ширина и высота логического экрана могут быть больше размеров физического экрана. Способ высвечивания изображений больших, чем размеры физического экрана зависит от реализации и может использовать преимущества конкретного оборудования (например, окна скроллинга в Macintosh scrolling windows). В противном случае изображение будет усечено по краям экрана.

    Значение 'pixel' также определяет число цветов в изображении. Диапазон значений 'pixel' составляет от 0 до 7, что соответствует от 1 до 8 битам. Это транслируется в диапазон от 2 (черно-белые изображения) до 256 цветов. Бит 3 в байте 5 зарезервирован для будущих определений и должен быть нулевым.

ГЛОБАЛЬНАЯ ТАБЛИЦА ЦВЕТОВ


    Глобальная таблица цветов является необязательной и рекомендуется для изображений, где требуется точная передача цветов. На существование этой таблицы указывает поле 'M' в байте 5 дескриптора экрана. Цветовая таблица может быть также связана с каждым изображением в GIF-файле, что будет описано позже. Однако обычно эта глобальная таблица будет использоваться, из-за ограничений, существующих в настоящее время в доступном оборудовании. Флаг 'M' в дескрипторе конкретного изображения обычно равен 0. Если глобальная таблица цветов присутствует, ее определение следует непосредственно за дескриптором экрана. Число элементов цветовой таблицы, следующей за описателем экрана равно 2**(число бит/пиксел), причем каждый элемент состоит из трех байтов, значения которых описывают соответственно относительную интенсивность красного, зеленого и синего цветов. Структура блока цветовой таблицы:

      биты
 7 6 5 4 3 2 1 0  Байт #
+---------------+
|интен. красного|  1    Значение красного для цвета 0
|---------------|
|интен. зеленого|  2    Значение зеленого для цвета 0
|---------------|
|интен. синего  |  3    Значение синего для цвета 0
|---------------|
|интен. красного|  4    Значение красного для цвета 1
|---------------|
|интен. зеленого|  5    Значение зеленого для цвета 1
|---------------|
|интен. синего  |  6    Значение синего для цвета 1
|---------------|
:               :       (Продолжение для остальных цветов)
    Получаемое значение каждого пиксела при высвечивании изображения будет соответствовать ближайшему доступному цвету из цветовой таблицы дисплея. Цветовые компоненты представляют собой значение относительной интенсивности от нулевой (0) до полной (255). Белый цвет может быть представлен как (255,255,255), черный как (0,0,0) и желтый как (180,180,0). При высвечивании на дисплеях, которые поддерживают менее 8 бит на цветовую компоненту, используются старшие биты. При создании элементов цветовой таблицы GIF на аппаратуре, поддерживающей менее 8 бит на компоненту, значение аппаратной компоненты должно быть конвертировано в 8-битный формат по следующей формуле:

    <значение_в_таблице> = <компонента>*255/(2**<число_бит> -1)

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

ДЕСКРИПТОР ИЗОБРАЖЕНИЯ


    Дескриптор изображения определяет действительное расположение и размеры последующего изображения внутри пространства, определенного в дескрипторе экрана. Также определяются флаги, указывающие на присутствие локальной таблицы для поиска цветов и определения последовательности высвечивания пикселов. Каждый дескриптор изображения начинается с символа-разделителя изображений. Роль разделителя изображений состоит просто в синхронизации при входе в дескриптор изображения. Это желательно, если GIF-файл состоит более, чем из одного изображения. Этот символ определен как шестнадцатиричное 0x2C или ',' (запятая). Как только этот символ встречается между изображениями, непосредственно за ним следует дескриптор изображения.

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

      биты
 7 6 5 4 3 2 1 0  Байт #
+---------------+
|0 0 1 0 1 1 0 0|  1    ',' - Символ-разделитель изображения
|---------------|
|               |  2    Начало изображения в пикселах относи-
|- Левый край  -|       тельно левого края экрана (сначала LSB)
|               |  3
|---------------|
|               |  4
|- Верхний край-|       Начало изображения в пикселах относительно
|               |  5    верхнего края экрана (сначала LSB)
|---------------|
|               |  6
|-    Ширина   -|       Ширина изображения в пикселах
|               |  7    (сначала LSB)
|---------------|
|               |  8
|-    Высота   -|       Высота изображения в пикселах
|               |  9    (сначала LSB)
|---------------|       M=0 - Использовать глобальную таблицу цве-
|M|I|0|0|0|pixel| 10          тов, игнорировать 'pixel'
+---------------+       M=1 - Далее следует локальная таблица цве-
                              тов, использовать 'pixel'
                        I=0 - Изображение отформатировано в после-
                              довательном порядке
                        I=1 - Изображение отформатировано в поряд-
                              ке переплетения
                        pixel+1 - число бит на пиксел в данном
                                  изображении

    Описание положения и размеров экрана должно быть находиться внутри матрицы, определенной в дескрипторе экрана. С другой стороны, нет необходимости, чтобы изображение полностью заполняло весь экран.

ЛОКАЛЬНАЯ ТАБЛИЦА ЦВЕТОВ


    Локальная таблица цветов необязательна и определена здесь для будущего использования. Если установлен бит 'M' байта 10 в дескрипторе изображения, то вслед за дескриптором изображения следует локальная таблица цветов, которая относится только к последующему изображению. После обработки изображения цветовую таблицу следует привести к той, которая была определена после дескриптора экрана. Заметим, что поле 'pixel' байта 10 в дескрипторе изображения используется только в том случае, если указана локальная таблица цветов. Она определяет не только размер пиксела (число битов в нем), но число элементов последующей цветовой таблицы. Число битов на пиксел также следует восстановить к тому значению, которое было определено в дескрипторе экрана, после того, как закончится обработка изображения.

РАСТРОВЫЕ ДАННЫЕ


    Формат самого изображения определен как серия значений номеров пикселов, которые образуют изображение. Пикселы запоминаются слева направо последовательно по строкам изображения. По умолчанию строки записываются последовательно, сверху вниз. В том случае, если установлен бит 'I' в байте 10 дескриптора изображения, то порядок строк при записи изображения соответствует четырех проходному процессу. При первом проходе записывается каждая 8-ая строка, начиная с верхней строки окна изображения. При втором проходе записывается каждая 8-ая строка, начиная с пятой строки сверху. На третьем проходе записывается каждая 4-ая строка, начиная с третьей строки окна. Четвертый проход завершает изображение, записывая каждую вторую строку, начиная со второй строки с сверху. Ниже приведено графическое описание этого процесса.

   Изображение
   Стр. Прох.1  Прох.2  Прох.3  Прох.4          Результат
   ------------------------------------------------------
     0  **1a**                                  **1a**
     1                          **4a**          **4a**
     2                  **3a**                  **3a**
     3                          **4b**          **4b**
     4          **2a**                          **2a**
     5                          **4c**          **4c**
     6                  **3b**                  **3b**
     7                          **4d**          **4d**
     8  **1b**                                  **1b**
     9                          **4e**          **4e**
    10                  **3c**                  **3c**
    11                          **4f**          **4f**
    12          **2b**                          **2b**
   . . .

    Значения пикселов изображения обрабатываются как цветовые индексы, указывающие на существующую таблицу цветов. В результате получается цветовое значение из таблицы, которое реально воспроизводится на экране. Эти серии цветовых индексов, число которых равно ширине_изображения*высоту_изображения, пропускаются через поток данных изображения GIF по одному значению на пиксел, сжимаются и упаковываются в соответствии с версией алгоритма сжатия LZW, как это определено в Приложении C.

ТЕРМИНАТОР GIF


    Для того, чтобы обеспечить синхронизацию с окончанием файла изображения GIF, декодер GIF должен обрабатывать окончание режима GIF по символу шестнадцатиричное 0x3B или ';', найденному после окончания обработки изображения. По соглашению декодирующие программы должны делать паузу и ждать действий, указывающих, что пользователь готов к продолжению. Это может быть возврат каретки, введенный с клавиатуры или щелчок кнопкой мыши. Для интерактивных приложений эти действия пользователя должны быть переданы в ядро программы как перевод каретки, для того, чтобы вычислительный процесс мог продолжаться. Обычно декодирующая программа покидает графический режим и возвращается к предыдущему процессу.

РАСШИРЕННЫЙ БЛОК GIF


    Для того, чтобы обеспечить аккуратное расширение определения GIF, необходим механизм для определения упаковки внутри потока данных GIF. Указанное расширение было определено и документировано CompuServe для того, чтобы предусмотреть управляемый способ усовершенствований.

    Расширенный блок GIF пакуется способом, похожим на тот, который использовался для растровых данных, но не сжимается. Основная структура блока:

 7 6 5 4 3 2 1 0  Байт #
+---------------+
|0 0 1 0 0 0 0 1|  1       '!' - Идентификатор расширенного блока
|---------------|
| функц. код    |  2       Расширенный функциональный код (0-255)
|---------------|    ---+
| байт-счетчик  |       |
|---------------|       |
|               |       |-- Повторяется столько раз, сколько
|  функ. байты  |       |   необходимо
|   данных      |       |
|---------------|    ---+
. . .       . . .
|---------------|
|0 0 0 0 0 0 0 0|       нулевой байт-счетчик (терминатор блока)
+---------------+
    Расширенный блок GIF может непосредственно предшествовать дескриптору изображения или находиться перед терминатором GIF.

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

ПРИЛОЖЕНИЕ A
ГЛОССАРИЙ

Пиксел

Растр

LSB

Таблица цветов

Переплетение

B Протокол

LZW

ПРИЛОЖЕНИЕ B
ПОСЛЕДОВАТЕЛЬНОСТЬ ОБМЕНОВ GIF ДЛЯ ИНТЕРАКТИВНОЙ СРЕДЫ


    Для управления на интерактивной линии связи между отправителем и получателем GIF определена следующая последовательность действий. Эта последовательность не применяется в приложениях, включающих загрузку статических GIF-файлов и не является частью GIF-файлов.

ЗАПРОС ВОЗМОЖНОСТЕЙ GIF - GIF CAPABILITIES ENQUIRY

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

    ESC [ > 0 g (g в нижнем регистре, пробелы вставлены для ясности)
(0x1B 0x5B 0x3E 0x30 0x67)

СООБЩЕНИЕ ВОЗМОЖНОСТЕЙ GIF - GIF CAPABILITIES RESPONSE

    Ответное сообщение о возможностях GIF возвращается интерактивным декодером и определяет возможности дисплея декодера для всех графических режимов, поддерживаемых математическим обеспечением. Заметьте, что оно может также включать графический принтер, а не только экран монитора. Общий формат этого сообщения:

#version;protocol{;dev,width,height,color-bits,color-res}... <CR>

'#' - GCR символ-идентификатор (Знак номера)

version - номер версии формата GIF; начально '87a'

protocol='0' - Протокол end-to-end не поддерживается декодером. Передача данных ведется непосредственным 8-битным потоком.

protocol='1' - Может поддерживать протокол коррекции ошибок при передаче данных от прямого хозяина на дисплей.

dev = '0' - Далее следуют параметры экрана

dev = '1' - Далее следуют параметры принтера

width - Максимальная ширина дисплея в пикселах

height - Максимальная высота дисплея в пикселах

color-bits - Поддерживаемое число битов на пиксел. Следовательно, поддерживаемое число цветов 2**color-bits.

color-res - Число битов на компоненту цвета, поддерживаемое аппаратной цветовой палитрой. Если color-res равен '0', таблица аппаратной палитры недоступна.

    Заметьте, что все значения в GCR возвращаются в десятичных числах ASCII и сообщение заканчивается символом "Возврат каретки".

    Следующее GCR-сообщение описывает три стандартных режима EGA с конфигурацией без принтера, поток данных GIF может обрабатываться в рамках протокола с коррекцией ошибок:
    #87a;1 ;0,320,200,4,0 ;0,640,200,2,2 ;0,640,350,4,2<CR>

ВВОД ГРАФИЧЕСКОГО РЕЖИМА GIF
    Две последовательности, определенные ниже вызывают для работы интерактивный декодер GIF. Между ними существует только единственное отличие. Оно заключается в выборе различной среды вывода. Эти последовательности: