Графический файл GIF

Оглавление

Ответственность составителей документа
Введение
Предоставление лицензии
Структура документа
Общее описание
Номера версий
Кодировщик
Декодировщик
Совместимость
Рекомендации
Таблицы цветов
Основные и дополнительные блоки, а также границы их действия
Размер блока
Использование формата GIF в составе более общего протокола
Субблоки данных
Блок-терминатор
Заголовок
Дескриптор логического экрана
Глобальная таблица цветов
Дескриптор изображения
Локальная таблица цветов
Кодирование изображений методом таблиц
Дополнительный блок управления изображением
Дополнительный блок комментария
Дополнительный блок с простым текстом
Дополнительный блок приложений
Завершающий блок

Приложения

Краткая справка
Грамматика формата GIF
Глоссарий
Соглашения
Чересстрочная запись изображений
Алгоритм LZW компрессии с кодом переменной длины
Передача изображений в режиме on-line

Дополнения

Отложенный код очистки в алгоритме LZW компрессии
Блок расширения для приложений — идентификатор приложения

2. Введение.

Данный документ определяет формат передачи графических изображений (Graphics
Interchange Format). В нем дается спецификация версии 89a, являющейся расширением
версии 87a.

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

Формат обмена графической информацией — Graphics Interchange Format(c) — является
собственностью фирмы CompuServe Incorporated. Только CompuServe Incorporated имеет
право формулировать данный формат, переопределять и дополнять его, изменять или
заменять отдельные части в описании формата — и делать это она может любым образом.

Настоящим фирма CompuServe Incorporated обязуется предоставлять ограниченную,
неэксклюзивную, бесплатную лицензию на использование Формата передачи графических
данных (sm) в программном обеспечении. Для программ, использующих формат GIF (sm),
в пользовательской и технической документации должно быть оговорено право
собственности на Формат, а также должна присутствовать торговая марка фирмы CompuServe
Incorporated. В программном обеспечении, которое использует формат GIF, но
распространяется, либо может распространяться без сопроводительной пользовательской
или технической документации, сообщение о праве собственности на Формат, а также
торговая марка фирмы CompuServe Incorporated должны появляться в специальном
сообщении на экране или принтере. В последнем случае, обязательные ссылки могут
появляться в первой заставке при открытии экрана, либо в последней заставке при
закрытии экрана. При этом достаточно воспользоваться сообщением следующего типа:

   "The Graphics Interchange Format(c) is the Copyright property of
   CompuServe Incorporated. GIF(sm) is a Service Mark property of
   CompuServe Incorporated."

За получением дополнительной информации обращайтесь по адресу:

   CompuServe Incorporated
   Graphics Technology Department
   5000 Arlington Center Boulevard
   Columbus, Ohio  43220
   U. S. A.

Фирма CompuServe Incorporated поддерживает специальный список почтовой рассылки
для всех частных лиц и организаций, которые желают получать копии данного документа,
когда в него будут вноситься исправления, либо осуществляться его полный пересмотр.
Данная услуга предоставляется бесплатно — сообщите нам, пожалуйста, ваши почтовый
адрес.
4. Структура документа.

В данном документе дается подробное описание Формата передачи графических данных.
Его целью является предоставление программистам необходимой справочной
информации. Перед тем, как приступить к написанию программы, желательно тщательно
прочесть весь документ, поскольку различные его части тесно увязаны друг с
другом. Описанию каждого из блоков Формата отводится отдельная глава. В каждой главе
имеется подраздел «Требуемая Версия», где записан номер версии, которым должен
воспользоваться кодировщик, если возникает необходимость занести этот блок в общий
поток данных. Кроме того, в каждом разделе представлена схема, показывающая расположение
отдельных полей описываемого блока. (При этом поля байтов изображаются в виде
колонки, где байты, находящиеся в верхней части схемы, первыми заносятся в общий
поток данных). Если внутри какого-либо байта дается описание отдельных битовых полей, то
старшие биты ставятся в схеме слева, а младшие — справа. В многобайтовых числовых полях первыми
пишутся младшие байты, затем старшие. Числа в данной спецификации записываются в
шестнадцатеричной нотации, начинающейся символами «0x». Описание битовых
полей начинается с самого старшего бита и заканчается самым младшим.
5. Общее описание.

В описываемом Формате передачи графических данных GIF(sm) сформулирован протокол,
предназначенный для обмена и передачи в диалоговом режиме растровых графических
изображений. Протокол независим от особенностей аппаратных средств, применяемых
как для создания изображений, так и для их воспроизведения.

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

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

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

Номер версии, указываемый в заголовке потока данных, должен нести информацию о том,
какой минимальный набор ресурсов необходим декодировщику для полной обработки
предлагаемого потока данных. Со своей стороны, кодировщик должен использовать
самый ранний номер версии, который вместе с тем не менее включал бы все блоки,
используемые в формируемом потоке данных. В каждой главе описания имеется строка
«Требуемая Версия», где указан номер самой ранней версии, в которой имелся бы
описываемый блок. Соответственно, проектируемый кодировщик в каждом конкретном случае
должен пытаться использовать самый ранний номер версии, в который были бы описаны все
блоки, задействованные в текущем потоке данных. Неоправданное использование более
поздних версий Формата будет бессмысленно препятствовать воспроизведению информации
на некоторых из имеющихся в хождении декодировщиках.
7. Кодировщик.

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

Поместить в поток данных всю информацию, необходимую для воспроизведения
представленных графических изображений.
Убедиться в том, что поток данных помечен самым ранним номером версии,
в которая содержатся определения для всех задействованных блоков. Это
гаранирует, что с формируемым потоком данных сможет работать максимальное
количество из существующих декодировщиков.
Следить за тем, чтобы кодирование графических образов осуществлялось таким
способом, чтобы обратный процесс декодирования был оптимизирован. Насколько это
возможно, следует появления в потоке данных избыточной информации.
По возможности следует избегать появления набора графических образов,
декодирование и воспроизведение которых потребовало бы перенастройки аппаратных
средств.
Установить в нуль (отключить) каждой бит и каждое поле, помеченное в Формате
как зарезервированные. Заметим, что в версии 87a некоторые поля в дескрипторах
логического экрана и изображения были зарезервированы, но уже в версии 89a они были
использованы для тех или иных целей.

8. Декодировщик.

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

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

9. Совместимость.

Кодировщик или декодировщик считаются соответствующими той или иной версии
Формата передачи графических данных, если они способны распознавать все его
конструкции и правильно их использовать. Кодировщик или декодировщик могут
соответствовать текущему номеру версии, и при этом не отвечать требованиям
более поздних реализаций Формата.
10. Рекомендации.

В каждой главе документа содержится запись «Рекомендация», в которой приводится
перечень инструкций и методик применения для тех или иных блоков Формата. Подобные
рекомендации относятся к проектированию более эффективных функций кодировщика и
декодировщика, к организации более оптимального использования полосы пропускания
в коммуникационных линиях. Указанные рекомендации желательно соблюдать.
11. Таблицы цветов.

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

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

Описываемые в Формате блоки условно могут быть разбиты на три группы: управляющие,
графические и специальные. Управляющие блоки, такие как заголовок, дескриптор
логического экрана, дополнительный блок управления графикой и блок-терминатор, содержат
сведения, необходимые для управления процессом обработки потока данных, либо информацию,
необходимую для настройки аппаратной части. Блоки с графической информацией, такие
как дескрипторы изображений и дополнительные блоки с простым текстом, содержат
данные и информацию, непосредственно связанные с воспроизведением на дисплее
графических образов. Специальные блоки, такие как дополнительные блоки комментариев
и приложений, также используются для управления процессом обработки данных, однако
сами не содержат информации, напрямую связанной с выводом на экран графического
изображения. За исключением дескриптора логического экрана и глобальной таблицы цветов,
имеющих отношение ко всему потоку данных в целом, все остальные управляющие блоки имеют
ограниченную область действия, а точнее, относятся только к тому блоку графической
информации, который записан следом. Блоки специального назначения не могут ограничивать
область применения управляющих блоков. Специальные блоки игнорируются в процессе
декодирования. Область действия управляющих блоков и блоков расширений ограничивается
графическим блоком или другим блоком расширений. Метки, используемые для идентификации
блоков, можно также разбить на три группы:
0x00-0x7F (0-127) — блоки с графической информацией; исключение составляет
блок-терминатор (0x3B);
0x80-0xF9 (128-249) — блоки управления;
0xFA-0xFF (250-255) — специальные блоки.
Представленные диапазоны выбраны таким образом, чтобы декодировщик мог определить
область действия того или иного блока, имея лишь его метку, т.е. даже в том случае,
если нет возможности непосредственно выполнить обработку самого блока.
13. Размер блока.

В поле «Размера Блока» указывается количество байт, занимаемых данным блоком
(при этом не берется в расчет размер самого этого поля, а также размер
субблока-терминатора, если таковой имеется). За исключением блоков с графическими
данными, все остальные должны иметь фиксированную длину. При этом назначением поля
«Размера Блока» является упрощение процедуры разбиения потока данных на отдельные
блоки, а не провоцирование на произвольное изменение размера указанных блоков.
Блоки же графических данных и субблоки имеют переменную длину соответственно
реальному объему данных.
14. Использование формата GIF в составе более общего протокола.

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

Описание. Субблок с данными — элементарная единица хранения данных. Субблоки
не имеют заголовка и, где бы они не находились в формате, обрабатываются в соответствии
с контекстом, определенным управляющими блоками. Первый байт в субблоке сообщает,
сколько байт с данными было записанно вслед за ним. Субблок с данными может содержать
от 0 до 255 байт. Заметим, что в заявляемом таким образом размере блока не учитается
присутствие самого байта размера. А потому в качестве пустого субблока в Формате
выступает такой субблок, в котором хоть и имеется поле размера, но в нем записано
значение 0x00.
Необходимая версия. 87a.
Синтаксис.

      7 6 5 4 3 2 1 0      Название поля         Тип
     +---------------+
  0  |               |     Размер блока          Байт
     +---------------+
  1  |               |
     +-             -+
  2  |               |
     +-             -+
  3  |               |
     +-             -+
     |               |       Данные              Байт
     +-             -+
     |               |
     +-   . . . .   -+
 до  |               |
     +-             -+
     |               |
     +-             -+
255  |               |
     +---------------+

Размер блока — количество байт, выделенных в субблоке под
данные; его значение должно находиться в диапазоне от 0 до 255 байт
(включительно).

Данные — любые 8-битные значения. В субблоке должно быть ровно
столько данных, сколько было заявлено в поле размера.

Расширения и поле действия. Блоки описанного типа всегда являются
лишь составной частью более крупных единиц. Сами по себе они не имеют собственного
поля действия.
Рекомендации. Никаких.

16. Блок-терминатор.

Описание. Это просто субблок нулевой длины, которым завершается цепочка
из идущих друг за другом субблоков с данными. Очевидно, что сам блок-терминатор
состоит лишь из одного байта, в котором записан размер блока и собственно не содержит
никаких данных.
Необходимая версия. 87a.
Синтаксис.

    7 6 5 4 3 2 1 0        Название поля          Тип
   +---------------+
0  |               |       Размер блока           Байт
   +---------------+

Размер блока — количество байт с данными, имеющихся в данном
субблоке; в этом поле всегда записано значение 0x00.
Данные — Описываемый блок не содержит никаких данных.

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

17. Заголовок.

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

   7 6 5 4 3 2 1 0        Название поля         Тип
  +---------------+
0 |               |       Идентификатор       3 байта
  +-             -+
1 |               |
  +-             -+
2 |               |
  +---------------+
3 |               |       Версия              3 байта
  +-             -+
4 |               |
  +-             -+
5 |               |
  +---------------+

Идентификатор — запись, однозначно
характеризующая поток данных,
представленных в формате GIF. В этом поле
может быть записано лишь слово ‘GIF’.
Версия — номер версии формата,
использованного при подготовке потока
данных. Номер версии косвенным образом
сообщает, какие минимальные средства
будут необходимы декодировщику для того,
чтобы полностью обработать содержимое
представленного потока данных.

Номера версий, имевшихся на 10 июля 1990 года:

«87a» — май 1987 года «89a» — июль 1989 года

По замыслу разработчиков, номера версий
будут идти в возрастающем порядке и
записываться в виде комбинации из двух цифр
(сперва 87, а затем 88, …,99,00, …,85,86) и одной
буквы (от ‘a’ до ‘z’ в алфавитном порядке).

Расширения и поле действия.
Описываемый блок относится ко всему
потоку данных в целом. Никакие
дополнительные блоки расширений не смогут
оказать на него воздействия.
Рекомендации.

Поле идентификатора — Идентификатор объявляет начало потока данных,
представленных в формате GIF. Вместе с тем в этом поле никоим образом не
конкретизируется, какие именно данные занесены в этот поток. Однако по значению
именно этого поля внешнее приложение должно распознавать поток данных в формате GIF.
(В Приложении G см. процедуру идентификации потока данных GIF в режиме on-line.)
Версия —

Кодировщик должен использовать самую раннюю версию, которая включала бы
описание всех блоков, задействованных в создаваемом потоке данных. Если
выполняется процедура объединения двух или более потоков данных, то в получившемся
потоке должна использоваться самая последняя из представленных исходных версий.

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

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

Описание. Дескриптор логического экрана содержит сведения, необходимые
для создания на экране дисплея графическиго окна, в пределах которого и будут
представлены изображения, извлекаемые из потока данных. Координаты, приведенные
в данном блоке, ведут отсчет от верхнего левого угла виртуального (логического)
экрана и вовсе необязательно напрямую связаны к реальным местоположением картинки на
экране дисплея. То есть, они могут в равной степени относиться как к координатам внутри
окошка для систем типа Windows, так и к координатам на печатном листе, если
картинка печатается на принтере.
Представленный блок относится к разряду ОБЯЗАТЕЛЬНЫХ. Однако, вместе с тем в каждом
потоке данных должен присутствовать только один дескриптор логического экрана.

Необходимая версия. Не имеет значения. Данный блок не привязан к какой-либо
версии формата и всегда должен стоять сразу же вслед за Заголовком.
Синтаксис.

     7 6 5 4 3 2 1 0        Название поля            Тип
    +---------------+
 0  |               |    Ширина логического       Беззнаковое
    +-             -+           экрана               целое
 1  |               |
    +---------------+
 2  |               |    Высота логического       Беззнаковое
    +-             -+           экрана               целое
 3  |               |
    +---------------+
 4  | |     | |     |   <Набор битовых полей>      См. ниже
    +---------------+
 5  |               |   Индекс фонового цвета        Байт
    +---------------+
 6  |               | Соотношение сторон пиксела     Байт
    +---------------+

<Битовые поля> =
Флаг глобальной таблицы цветов1 бит
Цветовое разрешение3 бита
Флаг сортировки1 бит
Размер глобальной таблицы цветов3 бита

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

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

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

Значения:
0 —
Глобальная таблица цветов отсутствует. Значение, записанное
в поле с индексом фонового цвета, игнорируется.

1 —
Сразу за дескриптором следует глобальная таблица цветов.
Кроме того, выполняется обработка поля с индексом фонового цвета.

Цветовое разрешение — количество бит, предоставленное для кодировки цвета
в исходной графике, минус 1. Косвенным образом этот параметр
характеризует полный размер таблицы, где были записаны все цвета, использованные
при создании графического образа. Однако на деле изображение могло использовать
лишь часть цветов, представленных в этой таблице. Итак, если в данном поле
записано значение 3, то в палитре исходной графики под кодировку каждого цвета
было отведено 4 бита. Даже если не каждый цвет из этой таблицы изначально был
доступен, тем не менее данный параметр характеризует богатство исходной
палитры.

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

Значения:
0 —
Таблица неотсортирована.

1 —
Таблица отсортирована в порядке уменьшения
важности: наиболее важный цвет стоит первым.

Размер глобальной таблицы цветов — Если флаг глобальной таблицы
цветов установлен в 1, то по значению этого поля можно вычислить, сколько байт было
выделено под глобальную таблицу цветов. Чтобы определить реальный размер этой таблицы
(количество цветов), необходимо возвести 2 в степень [значение поля + 1]. Даже если
глобальная таблица цветов отсутствует, данное поле все равно нужно заполнять в
соответствии с представленной формулой. Это делается для того, чтобы декодировщик
всегда смог выбирать наилучший режим для воспроизведения графических образов,
извлекаемых из потока данных. (Поле с размером глобальной таблицы цветов занимает в
байте 3 младших бита.)

Индекс фонового цвета — это индекс определенного цвета в глобальный таблице.
Цвет фона — это цвет, которым помечаются те пикселы на экране, которые не
перекрываются создаваемым графическим образом. Однако если флаг глобальной таблицы
цветов не установлен (равен нулю), то и в это поле должен быть записан нуль и оно
должно игнорироваться.

Соотношение сторон пиксела — Фактор, используемый при определении приближенного
соотношения сторон отдельного пиксела в исходном изображении. Если значение этого
параметра отлично от нуля, то указанное соотношение вычисляется согласно формуле:

параметр соотношения = (соотношение сторон пиксела + 15)/64

Здесь параметр «соотношение сторон» — это отношение ширины пиксела к его высоте.
Приведенный алгоритм позволяет программе дискретно менять соотношение сторон от 4:1
(самый широкий пиксел) до 1:4 (самый высокий пиксел) с шагом 1/64.

Значения:
0 —
Информация о соотношении сторон отсутствует.

1..255 —

Указанное здесь значение используется для определения соотношения сторон пиксела.

Расширения и поле действия. Информация, записанная в представленном
блоке, относится ко всему потоку данных. На нее не могут оказывать влияние
никакие блоки расширений.
Рекомендации. Никаких.

19. Глобальная таблица цветов.

Описание. В данном блоке размещается таблица цветов — набор
байтов, из которых строятся цветовые триплеты типа
«красный-зеленый-синий». Глобальная таблица цветов применяется для
построения изображений, не имеющих собственной локальной цветовой
таблицы, а также при обработке дополнительных блоков с простым текстом.
Если глобальная таблица цветов помещена в поток данных, то об этом
будет свидетельствовать одноименный флаг в дескрипторе логического
экрана, куда в этом случае записывается значение 1. И если глобальная
таблица действительно присутствует в потоке, то искать ее следует
сразу же за дескриптором логического экрана. Размер таблицы в байтах
составляет

3 x 2(заявленный размер глобальной таблицы цветов+1)

Описываемый блок относится к разряду НЕОБЯЗАТЕЛЬНЫХ, однако в потоке
данных может присутствовать только одна глобальная таблица цветов.
Необходимая версия. 87a
Синтаксис.

      7 6 5 4 3 2 1 0        Название поля     Тип
     +===============+
  0  |               |       Красный 0         Байт
     +-             -+
  1  |               |       Зеленый 0         Байт
     +-             -+
  2  |               |       Синий 0           Байт
     +-             -+
  3  |               |       Красный 1         Байт
     +-             -+
     |               |       Зеленый 1         Байт
     +-             -+
 до  |               |
     +-   . . . .   -+       ...
     |               |
     +-             -+
     |               |       Зеленый 255       Байт
     +-             -+
767  |               |       Синий 255         Байт
     +===============+

Расширения и поле действия. Данный блок оказывает воздействие
на весь поток данных. На него не могут повлиять никакие дополнительные
расширения.
Рекомендации. Никаких.

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

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

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

Описываемый блок ДОЛЖЕН ставиться перед каждым графическим изображением.
Вместе с тем каждому изображению в потоке данных должен соответствовать
только один дескриптор. В потоке данных можно размещать любое количество
графических образов.
Необходимая версия. 87a.
Синтаксис.

    7 6 5 4 3 2 1 0       Название поля             Тип
   +---------------+
0  |               |      Идентификатор            Байт
   +---------------+
1  |               | Положение левой границы    Беззнаковое
   +-             -+       изображения             целое
2  |               |
   +---------------+
3  |               | Положение верхней границы  Беззнаковое
   +-             -+       изображения             целое
4  |               |
   +---------------+
5  |               |    Ширина изображения      Беззнаковое
   +-             -+                               целое
6  |               |
   +---------------+
7  |               |    Высота изображения      Беззнаковое
   +-             -+                               целое
8  |               |
   +---------------+
9  | | | |   |     |      <Битовые поля>          См. ниже
   +---------------+

<Битовые поля> =
Флаг локальной таблицы цветов1 бит
Флаг чересстрочной развертки1 бит
Флаг сортировки1 бит
Зарезервировано2 бита
Размер локальной таблицы цветов3 бита

Идентификатор — Отмечает начало блока с дескриптором для
очередного изображения. Содержит фиксированное значение 0x2C.

Положение левой границы графического изображения — номер колонки
(пикселов), на которую приходится левый край изображения. Отсчет
производится от левого края логического экрана. При этом считается, что
крайняя левая колонка логического экрана имеет номер 0.

Положение верхней границы графического изображения — номер того
ряда (пикселов), на который приходится верхний край изображения.
Отсчет производится от верхнего края логического экрана. При этом
считается, что верхний ряд логического экрана имеет номер 0.
Ширина изображения — Ширина изображения в пикселах.
Высота изображения — Высота изображения в пикселах.

Флаг локальной таблицы цветов — Свидетельствует о том, что сразу
за дескриптором изображения начинается локальная таблица цветов. (Под
этот параметр отводится самый старший бит в описываемом байте).

Значения:
0 —
Локальная таблица цветов отсутствует. По возможности
следует воспользоваться глобальной таблицей цветов.
1 —
Локальная таблица цветов была записана сразу вслед
за этим дескриптором.

Флаг чересстрочной развертки — Свидетельствует о том, что был
использован чересстрочный режим записи изображения. В чересстрочном режиме изображение
рисуется не за один, а за четыре прохода. Подробности см. в Приложении E.

Значение:
0 —
Чересстрочная развертка отсутствует.
1 —
Задействован режим чересстрочной развертки.

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

Значения:
0 —
Таблица не отсортирована.
1 —
Цвета отсортированы в порядке уменьшения важности,
наиболее важный цвет стоит первым.

Размер локальной таблицы цветов — Если флаг локальной таблицы
цветов был установлен в 1, то размер локальной таблицы цветов
(количество выделенных под нее байт) вычисляется по значению данного
поля. Чтобы определить размер таблицы, возведите 2 в степень
(значение поля + 1). Если же локальная таблица цветов не была
предоставлена, то в этом поле должно содержаться значение 0.
(Описываемое поле занимает в байте три младших бита).

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

21. Локальная таблица цветов.

Описание. В данном блоке содержится таблица цветов —
последовательность байтов, из которых складываются цветовые триплеты
по типу «красный-зеленый-синий». Локальная таблица цветов используется
при обработке идущего следом за ней графического изображения.
Если к рисунку прилагается локальная таблица цветов, то в его
дескрипторе в поле одноименного флага записывается значение 1. Если
в поток данных помещается локальная таблица цветов, то она ставится
сразу же вслед за дескриптором изображения, а количество выделяемых
ей байт составляет

3×2(размер локальной таблицы, указанный в дескрипторе + 1)

Будучи представленной декодировщику, локальная таблица цветов на время
становится активной — именно она должна использоваться при обработке
идущего вслед за ней изображения. Рассматриваемый блок относится к
разряду НЕОБЯЗАТЕЛЬНЫХ. В потоке данных на каждый дескриптор
изображения может приходиться не более одной локальной таблицы цветов.
Локальная таблица цветов используется при обработке лишь того
графического изображения, которое ассоциируется со стоящим перед
ней дескриптором.
Необходимая версия. 87a.
Синтаксис.

      7 6 5 4 3 2 1 0        Название поля        Тип
     +===============+
  0  |               |       Красный 0            Байт
     +-             -+
  1  |               |       Зеленый 0            Байт
     +-             -+
  2  |               |       Синий 0              Байт
     +-             -+
  3  |               |       Красный 1            Байт
     +-             -+
     |               |       Зеленый 1            Байт
     +-             -+
     |               |
     +-   . . . .   -+       ...
 до  |               |
     +-             -+
     |               |       Зеленый 255          Байт
     +-             -+
767  |               |       Синий 255            Байт
     +===============+

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

22. Кодирование изображений методом таблиц

Описание. Графические данные представляют собой набор субблоков,
размером каждый не более 255 байт. Под каждый пиксел графического
изображения в этих субблоках отводится индекс, имеющий отношение к
активной таблице цветов. Пикселы изображения нумеруются по порядку
слева направо и сверху вниз. С другой стороны, каждый такой индекс
должен находиться в пределах того диапазона цветов (начинающегося с 0),
который предоставляет активная на данный момент таблица. Затем массив
индексов кодируется с помощью алгоритма LZW (с кодом переменной длины),
описанного в Приложении F
Необходимая версия. 87a.
Синтаксис. Графические данные имеют следующий формат:

 7 6 5 4 3 2 1 0        Название поля       Тип
+---------------+
|               |     Минимальный размер    Байт
+---------------+         кода в LZW
+===============+
|               |
/               / Графические данные
|               | Субблоки данных
+===============+

Минимальный размер кода в LZW. В этом байте
указывается, сколько бит первоначально используется в
LZW кодах во время обработки графических данных, см.
Приложение F.

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

23. Дополнительный блок управления изображением.

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

Хотя данный блок относится к разряду НЕОБЯЗАТЕЛЬНЫХ, перед графическим
блоком может ставиться только один дополнительный блок управления.
Это условие является единственным фактором, ограничивающим количество
дополнительных блоков управления, встречающихся в потоке данных.
Необходимая версия. 89a.
Синтаксис.

    7 6 5 4 3 2 1 0        Название поля            Тип
   +---------------+
0  |               |       Идентификатор            Байт
   +---------------+
1  |               |  маркер управляющего блока     Байт
   +---------------+

+—————+
0 | | Размер блока Байт
+—————+
1 | | | | | См. ниже
+—————+
2 | | Время задержки Беззнаковое
+- -+ целое
3 | |
+—————+
4 | | Индекс прозрачного цвета Байт
+—————+

+—————+
0 | | Терминатор блока Байт
+—————+

<Битовые поля> =
Зарезервировано3 бита
Способ размещения3 бита
Флаг ручного ввода1 бит
Флаг прозрачного цвета1 бит

Идентификатор — объявляет начало дополнительного
блока. Всегда имеет значение 0x21.

Маркер управляющего блока — сообщает, что данный блок
относится к разряду управляющих графикой. Всегда имеет
значение 0xF9.

Размер блока — количество байт, занимаемых блоком,
исключая поля «Размер блока» и «Терминатор». Всегда имеет
значение 4.

Метод размещения — определяет алгоритм, по которому
будет выполняться обработка графического изображения после
его появления на экране дисплея.

Значения:
0 —
Метод размещения не указан. Декодер не
должен выполнять никаких специальных действий.
1 —
Метод не указан. Изображение должно
оставаться на месте.
2 —
Восстановить до фонового цвета — в область,
занятую изображением, должен быть возвращен фоновый цвет.
3 —
Восстановить предыдущее. Декодировщик
должен восстановить картинку, которая была до вывода на экран данного
изображения.
4-7 —
Не определены.

Флаг ручного ввода — указывает, должен или нет пользователь
осуществлять какой-либо ввод перед продолжением программы. Если этот
флаг установлен, то обработка данных будет продолжена только после того,
как пользователь введет данные. Характер вводимых пользователем
данных определяется самой программой (возврат каретки, щелчок
клавишей мыши или другое).

Значения:
0 —
пользователь не обязан вводить данные.
1 —
пользователь должен ввести данные.

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

Флаг прозрачности — сообщает, указан ли индекс прозрачности в
одноименном поле. (Этот флаг занимает самый младший бит в описываемом
байте.)

Значения:
0 —
Индекс прозрачности не указан.
1 —
Индекс прозрачности присутствует.

Время задержки — Если в этом поле записано ненулевое значение,
то оно объявляет временной интервал (в сотых долях секунды —
1/100), который должна выдержать программа, прежде чем продолжить
обработку данных. Отсчет временного интервала начинается сразу же после
вывода соответствующего изображения на экран. Время задержки может быть
указано одновременно с установкой флага ручного ввода.

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

Терминатор — Блок данных нулевой длины, фиксирующий конец
Дополнительного блока управления графикой.

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

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

Флаг ручного ввода — Если этот флаг выставлен, и стало быть
программе указано, что она должна ожидать от пользователя входа данных,
то декодировщик может по собственной инициативе подавать звонок (код
0x07), стараясь уведомить пользователя о том, что от него что-то
требуется. Если же при том не было указано времени задержки, то
декодировщик должен ждать ручной ввод данных неопределенно долгое время.
Желательно однако, чтобы кодировщик не выставлял флаг ручного ввода, не
указав при этом времени задержки.

24. Дополнительный блок комментария.

Описание. Дополнительный блок комментария содержит текстовую
информацию, которая реально не является частью какого-либо графического
изображения в формате GIF, помещенного в текущий поток данных. Назначение этого блока —
запись комментариев к графическим изображениям, официальных сведений,
описаний или информации любого другого типа, не связанной с управлением
или передачей графических данных. Декодировщик может игнорировать
дополнительный блок с комментариями, либо заносить его в буфер для
последующей обработки. Однако блок комментариев ни в коем случае не
должен ни прерывать процесс обработки потока данных, ни влиять на него
каким-либо образом.
Данный блок относится к разряду НЕОБЯЗАТЕЛЬНЫХ. В потоке данных может
встречаться любое количество блоков с комментариями.
Необходимая версия. 89a.
Синтаксис.

      7 6 5 4 3 2 1 0     Название поля            Тип
     +---------------+
  0  |               |    Идентификатор расширения Байт
     +---------------+
  1  |               |    Заголовок комментария    Байт
     +---------------+

+===============+
| |
N | | Текст комментария Субблоки
| | с данными
+===============+

+—————+
0 | | Терминатор блока Байт
+—————+

Идентификатор расширения — объявляет начало блока.
Содержит строго фиксированное значение 0x21.

Заголовок комментария — идентифицирует данный блок
в качестве дополнительного блока с комментарием. Содержит
фиксированное значение 0xFE.

Текст комментария — Последовательность субблоков,
каждый из которых имеет объявленную длину не более 255
байт и не менее 1 байта. Размер субблока указывается в
его первом байте. Набор субблоков завершается
блоком-терминатором.

Блок-терминатор — Появление блока данных с нулевой
длиной свидетельствует о завершении всего блока
комментариев.

Расширения и поле действия. Представленный блок не оказывает
влияния на другие блоки. И наоборот, на него не влияют никакие
другие дополнительные блоки.
Рекомендации.

Текст комментария — пишется для людей. Должен
содержать текст, составленный с использованием 7-битного набора
ASCII-символов. Его нельзя использовать под размещение управляющей
информации для специальной обработки.

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

25. Дополнительный блок с простым текстом.

Описание. Дополнительный блок с простым текстом содержит
текстовые данные и параметры, необходимые для представления последних
как в графическом, так и в простом виде. Текстовые данные кодируются с
помощью печатных символов 7-битного набора ASCII. При выводе на экран
каждый символ помещается в ячейку некой сетки, построенной в
соответствии с параметрами, указанными в других полях этого же блока.
Поскольку каждый символ печатается в отдельной ячейке, то очевидно,
что текстовые данные из этого блока должны печататься с помощью шрифта
фиксированной ширины, иными словами, все символы должны занимать ячейки
одной и той же ширины, и печататься с помощью шрифта, имеющего наиболее
подходящую для этого ширину. Остальные сведения можно почерпнуть из
нижеследующего пункта «Рекомендации». Символы один за другим
извлекаются из той части описываемого блока, где содержится текст, и
последовательно впечатываются в ячейки сетки, начиная с крайней верхней
левой позиции и затем далее по порядку слева направо и сверху вниз.
Текст будет печататься таким образом до тех пор, пока не кончатся
предоставленные данные, либо не будут заполнены все ячейки указанной
сетки. В сетке должно помещаться целое число ячеек. В том же случае,
если сообщаемые в параметрах блока размеры ячейки не позволяют
выполнить это условие, неполные ячейки должны быть отброшены, и
кодировщик должен так изменить размер самой сетки, чтобы такого более
не происходило. Условием использования дополнительного блока с
простым текстом является доступность глобальной таблицы цветов,
поскольку цвет, используемый в блоке, берется либо из глобальной
таблицы цветов, если таковая имеется, либо — в противном случае — из
глобальный таблицы цветов предыдущего потока данных, если таковая была
сохранена. Рассматриваемый блок относится к графическому типу, а потому
на него может оказывать воздействие дополнительный блок управления
графикой. Дополнительный блок с простым текстом относится к разряду
НЕОБЯЗАТЕЛЬНЫХ, в потоке данных может встретиться любое количество
таких блоков.
Необходимая версия. 89a.
Синтаксис.

      7 6 5 4 3 2 1 0     Название поля            Тип
     +---------------+
  0  |               |    Идентификатор            Байт
     +---------------+
  1  |               | Заголовок простого          Байт
     +---------------+       текста

     +---------------+
  0  |               |    Размер блока             Байт
     +---------------+
  1  |               |   Положение левой        Беззнаковое
     +-             -+    границы сетки            целое
  2  |               |
     +---------------+
  3  |               |  Положение верхней       Беззнаковое
     +-             -+    границы сетки            целое

  4  |               |
     +---------------+
  5  |               |    Ширина сетки          Беззнаковое
     +-             -+                             целое
  6  |               |
     +---------------+
  7  |               |    Высота сетки          Беззнаковое
     +-             -+                             целое
  8  |               |
     +---------------+
  9  |               | Ширина ячейки с символом     Байт
     +---------------+
 10  |               | Высота ячейки с символом     Байт
     +---------------+
 11  |               |    Индекс цвета              Байт
     +---------------+  основного текста
 12  |               | Индекс фонового цвета        Байт
     +---------------+
     +===============+
     |               |
  N  |               |    Простой текст           Субблоки
     |               |                            с данными
     +===============+
     +---------------+
  0  |               |   Терминатор блока           Байт
     +---------------+

Идентификатор — Объявляет начало дополнительного
блока. Содержит фиксированное значение 0x21.
Заголовок простого текста — Сообщает о том, что данный
дополнительный блок содержит простой текст. Имеет значение
0x01.
Размер блока — количество байт в управляющем блоке,
который начнется сразу же за этим полем и закончится
перед субблоками с данными. В этом поле содержится
фиксированное значение 12.
Положение левой границы сетки, осуществляющей разметку
текста — Задает (в пикселах) положение левой границы
создаваемой сетки относительно левого края логического
окна.
Положение верхней границы сетки, осуществляющей разметку
текста — Задает (в пикселах) положение верхней границы
создаваемой сетки относительно верхнего края логического
окна.
Ширина сетки — Задает в пикселах ширину сетки, по
которой будет осуществляться расстановка текста.
Высота сетки — Задает в пикселах высоту сетки, по
которой будет осуществляться расстановка текста.
Ширина ячейки с символом — Задает в пикселах ширину
ячеек в создаваемой сетке.
Высота ячейки с символом — Задает в пикселах высоту
ячеек в создаваемой сетке.
Индекс цвета для основного цвета — Индекс в глобальной
таблице для цвета, в который будут окрашены буквы текста.
Индекс для фона в тексте — Индекс в глобальной таблице
для цвета, который будет использоваться в качестве фона для
текста.
Данные с текстом — Набор субблоков, каждый из которых
может иметь заявленную длину от 255 до 1 (размер субблока
указывается в байте, который предваряет собственно данные).
Последовательность субблоков завершает блок-терминатор.
Блок-терминатор — Блок данных, имеющий нулевую длину и обозначающий
конец общего блока данных.

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

Рекомендации. Предполагается, что данные в дополнительном блоке
описываемого типа представляют собой предварительно отформатированный
текст. Конечный выбор шрифта и размера оставляется на усмотрение самого
декодировщика. Если в тексте встречаются символы, чей код менее 0x20 или
более 0xf7, декодировщик должен автоматически ставить в соответствующих
ячейках пробел (0x20). Во время разметки текста кодировщик должен
выбирать такой размер ячеек и всей сетки в целом, чтобы в ней и по
горизонтали и по вертикали размещалось целое количество ячеек. Для
наилучшей совместимости программ, ячейка символов должна иметь размеры
8×8 или 8×16 («ширина» x «высота»). Текст же нестандартного размера
должен рассматриваться просто как графическое изображение.

26. Дополнительный блок приложений.

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

      7 6 5 4 3 2 1 0        Название поля        Тип
     +---------------+
  0  |               |  Идентификатор расширения  Байт
     +---------------+
  1  |               |      Заголовок блока       Байт
     +---------------+

     +---------------+
  0  |               |       Размер блока         Байт
     +---------------+
  1  |               |
     +-             -+
  2  |               |
     +-             -+
  3  |               |  Идентификатор приложения  8 байт
     +-             -+
  4  |               |
     +-             -+
  5  |               |
     +-             -+
  6  |               |
     +-             -+
  7  |               |
     +-             -+
  8  |               |
     +---------------+
  9  |               |
     +-             -+
 10  |               |     Идентификационный      3 байта
     +-             -+       код приложения
 11  |               |
     +---------------+

     +===============+
     |               |
     |               |   Данные для приложения   Субблоки
     |               |                           с данными
     |               |
     +===============+

     +---------------+
  0  |               |      Блок-терминатор        Байт
     +---------------+

Идентификатор расширения — сообщает, что данный блок относится к
разряду дополнительных. Содержит фиксированное значение 0x21.

Заголовок дополнительного блока — идентифицирует блок как
дополнительный блок приложений. В этом поле может содержаться лишь
фиксированное значение 0xFF.

Размер блока — количество байт в информационном блоке, который
начинается тут же и заканчивается непосредственно перед данными
для прикладной программы. В поле «Размер блока» содержится
фиксированное значение 11.

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

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

Расширения и поле действия. Описанный блок не оказывает
влияния на другие блоки в общем потоке данных, и наборот, на него не
могут повлиять какие-либо другие дополнительные блоки.
Рекомендации. Никаких.

27. Завершающий блок.

Описание. Блок, имеющий только одно поле-параметр и объявляющий
в формате GIF конец потока данных. В этом поле содержится фиксированное
значение 0x3B.
Необходимая версия. 87a.
Синтаксис.

    7 6 5 4 3 2 1 0     Название поля      Тип
   +---------------+
0  |               | Блок завершения GIF   Байт
   +---------------+

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

Приложения

A. Краткая справка.

Название блока
Обязательность
Заголовок
Расш.
Версия

Дополнительный приложения
необяз.
(*)
0xFF (255)
да
89a

Дополнительный комментария
необяз.
(*)
0xFE (254)
да
89a

Глобальная таблица цветов
необяз.
(1)
отсутствует
нет
87a

Дополнительный управления изображением
необяз.
(*)
0xF9 (249)
да
89a

Заголовок
обяз.
(1)
отсутствует
нет
N/A

Дескриптор изображения
необяз.
(*)
0x2C (044)
нет
87a (89a)

Локальная таблица цветов
необяз.
(*)
отсутствует
нет
87a

Дескриптор логического экрана
обяз.
(1)
отсутствует
нет
87a (89a)

Дополнительный с простым текстом
необяз.
(*)
0x01 (001)
да
89a

Завершающий
обяз.
(1)
0x3B (059)
нет
87a

Блоки без заголовков

Заголовок
обяз.
(1)
отсутствует
нет
N/A

Дескриптор логического экрана
обяз.
(1)
отсутствует
нет
87a (89a)

Глобальная таблица цветов
необяз.
(1)
отсутствует
нет
87a

Локальная таблица цветов
необяз.
(*)
отсутствует
нет
87a

Блоки управления графикой

Дополнительный с простым текстом
необяз.
(*)
0x01 (001)
да
89a

Дескриптор изображения
необяз.
(*)
0x2C (044)
нет
87a (89a)

Управляющие блоки

Дополнительный управления изображением
необяз.
(*)
0xF9 (249)
да
89a

Блоки специального назначения

Завершающий
обяз.
(1)
0x3B (059)
нет
87a

Дополнительный комментария
необяз.
(*)
0xFE (254)
да
89a

Дополнительный приложения
необяз.
(*)
0xFF (255)
да
89a

Легенда:

(1) если присутствует, то не более одного раза
(*) отсутствует, либо имеется в одном или нескольких экземплярах
(+) обязательно имеется в одном или нескольких экземплярах

Замечания: Заголовок во всех версиях стандарта стается тем же
самым.
(89a) Синтаксис дескриптора логического экрана и дескриптора изображения
остался тем же самым при переходе с версии 87a на версию 89a; однако
некоторые из полей, зарезервированных в версии 87a, в 89a были
использованы.
B. Грамматика формата GIF.

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

Легенда:

<>слово в грамматике
::=символ определения
*отсутствует, либо появляется один или несколько раз
+появляется один или несколько раз
|альтернативный элемент
[]необязательный элемент

Пример
:

<Поток данных в формате GIF> ::= Заголовок <Логический экран> <Данные>* Завершающий блок

В этом правиле определен обобщенный объект <Поток данных GIF>.
Поток начинается с Заголовка. За ним следует запись «Логический Экран»,
описываемая отдельным правилом. За логическим экраном следует запись
«Данные» (также свое правило). И наконец, за объектом «Данные» идет
«Завершающий блок». Поскольку нет правила, в котором давалось бы
определение объектов «Заголовок» и «Завершающий блок», то,
следовательно, они должны быть описаны в самой спецификации. Поскольку
рядом с записью «Данные» стоит специальный символ (*), то в данном
месте может быть записано любое количество объектов типа «Данные»
(либо таковые вообще могут отсутствовать в потоке). Дальнейшие
подробности см. в стандартных материалах по языкам программирования.
Грамматика.

<Поток данных в формате GIF> ::=
Заголовок <Логический экран> <Данные>* Завершающий блок
<Логический экран> ::=
Дескриптор логического экрана [Глобальная таблица цветов]
<Данные> ::=
<Графический блок> | <Блок специального назначения>
<Графический блок> ::=
[Дополнительный блок управления графикой] <Блок графической информации>
<Блок графической информации> ::=
<Табличное изображение> | Дополнительный блок простого текста
<Табличное изображение> ::=
Дескриптор изображения [Локальная таблица цветов] Графические данные
<Блок специального назначения> ::=
Дополнительный блок приложения | Дополнительный блок комментария

ЗАМЕЧАНИЕ: Из представленной грамматики следует, что поток
данных в формате GIF, в частности, может представлять собой комбинацию
«Заголовок», «Дескриптор логического экрана», «Глобальная таблица
цветов» и «Завершающий блок». Столь специфичный вариант обычно
используется для загрузки в GIF-декодировщик глобальной таблицы цветов
и подготовки его тем самым к получению потоков данных, вообще лишенных
собственных таблиц цвета.
C. Глоссарий.

Активная таблица цветов —
Таблица цветов, используемая для создания очередного
графического изображения. Если графическое изображение имеет собственную
локальную таблицу цветов, то последняя на время его обработки становится
активной. Если же очередное графическое изображение локальной таблицы
цветов не имеет, или если это дополнительный блок с простым текстом, то
в качестве активной выступает глобальная таблица цветов, если таковая
имеется в потоке данных. Если же в потоке данных глобальная таблица
цветов отсутствует, то в качестве активной выступает либо таблица,
оставшаяся от предыдущего потока данных, либо внутренняя таблица
декодировщика.
Блок —
Набор байтов, образующий элементарную единицу протокола. В общем
случае, под это определение подпадают блоки с заголовками и без, а
также различные дополнительные блоки протокола.
Поток Данных —
В стандарте GIF поток данных образуется из блоков и субблоков,
содержащих данные графических изображений, а также контрольную
информацию, управляющую процедурой их отображения на эране дисплея.
В потоке данных все управляющие блоки и блоки графических данных должны
стоять после заголовка, но перед блоком-терминатором.
Декодировщик —
программа, предназначенная для обработки потока данных в формате
GIF и вывода на экран содержащихся в нем графических изображений.
Кодировщик —
программа, предназначенная для перехвата растровых графических
изображений и форматирования затем их в соответствии с требованиями
Формата Передачи Данных (GIF).
Дополнительный блок —
блок протокола, имеющий специальный идентификатор 0x21.
Идентификатор расширения —
заголовок (0x21), идентифицирующий блок протокола как дополнительный.
Графика —
графические данные, которые по определенному алгоритму могут быть
отображены на экране. Здесь понятие «Графика» является более общим, чем
просто графическое изображение. В него кроме собственно графических
изображений включаются также такие данные, как текст, каждый символ
которого выводится на экране с использованием битовой карты.
Изображение —
данные, в которых записано изображение или рисунок. При этом
само графическое изображение рассматривается как набор пикселов,
называемый растром данного изображения.
Растр —
Набор пикселов, из которых состоит изображение.

D. Соглашения.

Мультипликация —
Предложенный формат передачи графических данных не предназначен для
создания мультипликации, даже несмотря на тот факт, что он в некоторой
степени наделен такими возможностями.
Порядок записи байтов —
Если обратное не объявлено, то в многобайтовых числовых полях
сперва ставится самый младший байт.
Цветовые индексы —
Индексы всегда относятся к активной в данный момент таблице
цветов. Это может быть либо глобальная таблица цветов, либо локальная.
Порядок кодирования цвета —
Если не оговорено обратное, то все цвета в изображении формируются
по стандарту RGB — смешиванием трех основных цветов. Порядок записи этих
цветов — «Красный-Зеленый-Синий».
Таблицы цветов —
Обе таблицы цветов — и глобальная, и локальная — являются
необязательными. Если в потоке данных представлена глобальная таблица
цветов, то она должна использоваться при обработке всех изображений в
потоке данных, которые не имеют собственной локальной таблицы цветов.
Если же у изображения такая таблица есть, то она будет использована
вместо глобальной таблицы цветов. Если же в потоке данных вообще не
представлено никакой таблицы цветов, программа обработки вправе
использовать любую имеющуюся в ее распоряжении таблицу. Если
графические образы, записанные в следущих друг за другом потоках
данных, взаимосвязаны и созданы с использованием одной и той же
таблицы цветов, то кодировщик может в первом же потоке данных
записать эту таблицу в качестве глобальной и затем оставить все
остальные потоки вообще без собственных глобальных и локальных таблиц
цвета. Тем самым устраняется излишнее дублирование цветовой таблицы.
Для этого желательно, чтобы декодировщик сохранял глобальную таблицу
цветов от предыдущего потока, а потом использовал ее с новым потоком
данных, в случае, если последний не содержит ни глобальной, ни
каких-либо локальных таблиц цвета. Вообще же то, что прикладная
программа способна использовать предыдущие таблицы цветов, позволяет ей
существенно сократить в передаче объем избыточной информации.
Дополнительные блоки —
Распознаются по идентификатору расширения, объявляющему начало
блока. Вслед за ним идет идентификатор блока, определяющий, с каким
типом блока мы имеем дело. Идентификатор блока — это номер, чье
значение может лежать в диапазоне от 0x00 до 0xFF включительно. Специальные
дополнительные блоки для декодировщика невидимы и могут быть опущены
при передаче потока данных в режиме on-line. Однако механизм диалога,
заложенный в формулировку формата GIF, предоставляет возможность
запросить режим передачи всех блоков. По умолчанию же специальные
блоки в режиме on-line не передаются.
Зарезервированные поля —
Считается, что в зарезервированных полях каждый бит должен иметь
значение 0 (т.е. быть отключен).

E. Черезстрочная запись изображений.

Порядок записи пикселов в изображении, кодируемом в черезстрочном
режиме:

Группа 1:каждый 8-ой ряд, начиная с 0-го ряда.(проход 1)
Группа 2:каждый 8-ой ряд, начиная с 4-го ряда.(проход 2)
Группа 3:каждый 4-ый ряд, начиная со 2-го ряда.(проход 3)
Группа 4:каждый 2-ой ряд, начиная с 1-го ряда.(проход 4)

Следующий пример иллюстрирует порядок записи в изображении в случае
режима черезстрочной развертки.

Номер ряда                     Развертка          Номер прохода

0   -----------------------------------------   1
1   -----------------------------------------                     4
2   -----------------------------------------               3
3   -----------------------------------------                     4
4   -----------------------------------------         2
5   -----------------------------------------                     4
6   -----------------------------------------               3
7   -----------------------------------------                     4
8   -----------------------------------------   1
9   -----------------------------------------                     4
10  -----------------------------------------               3
11  -----------------------------------------                     4
12  -----------------------------------------         2
13  -----------------------------------------                     4
14  -----------------------------------------               3
15  -----------------------------------------                     4
16  -----------------------------------------   1
17  -----------------------------------------                     4
18  -----------------------------------------               3
19  -----------------------------------------                     4

F. Алгоритм LZW компрессии с кодом переменной длины.

Алгоритм компрессии с кодом переменной длины LZW является
разновидностью алгоритма компрессии Lempel-Ziv, в котором коды
переменной длиной используются для замены сочетаний, обнаруженных в
исходных данных. В данном алгоритме используется код, либо переводная
таблица, составленная из комбинаций, встретившихся в исходных данных.
Каждая новая комбинация заносится в эту таблицу, и затем в потоке
данных, подлежащем компрессии, замещается определенным индексом.

Программа компрессии получает входные данные и строит код или таблицу
перевода из новых ключевых комбинаций по мере того, как они
встречаются в потоке данных. Каждая новая комбинация заносится в
таблицу кодов, а ее индекс записывается в исходящий поток данных.
Если программа компрессии сталкиваются с комбинацией, которая уже
встречалась, то вместо нее в исходящий поток данных она ставит
соответствующий индекс из таблицы, таким образом достигается
общая компрессия данных. Программа декомпрессии получает на вход
сжатый поток данных и воссоздает по нему код, либо таблицу перевода.
В процессе обработки потока сжатых данных эти коды используются в
качестве индексов таблицы, а соответствующие им комбинации заносятся в
поток восстаналиваемых данных. Таким образом получается декомпрессия
данных. Подробности алгоритма обработки описаны ниже. Отличительная
черта нашего алгоритма — код переменной длины — напрямую связана с
исходным размером кода (см. параметр «размер кода LZW»),
сообщающим,
сколько бит изначально было использовано в процессе компрессии для
записи кода. Если количество комбинаций, обнаруженных программой
компрессии в исходном потоке данных, превышает количество образцов,
которое можно было бы записать в таблицу при данном размере кода
в соответствии с алгоритмом LZW, то количество бит, предоставляемых
для записи кода LZW, автоматически увеличивается на единицу.

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

 7 6 5 4 3 2 1 0
+---------------+
|размер кода LZW|
+---------------+

+---------------+ ----+
| размер блока  |     |
+---------------+     |
|               |     +-- повторяется столько раз
|  байты данных |     |   сколько необходимо.
|               |     |
+---------------+ ----+

. . .       . . . ------- Код, которым завершаются данные при
                          LZW компрессии, должен стоять
                          перед терминатором
+---------------+
|0 0 0 0 0 0 0 0|  Терминатор
+---------------+

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

Фиксация размера кода — Определяется количество бит,
которое необходимо для преобразования исходных графических данных.
Компрессия данных — Преобразование пикселов графического
изображения в некую укороченну последовательность кодов.
Создание последовательностей байтов — Преобразование
массива кодов компрессии в поток байтов с 8-ю значащими битами.
Упаковка байтов — Компоновка полученных наборов байтов в
субблоки (при этом перед каждым субблоком ставится байт-счетчик) и
отправка их получателю.

Выбор размера кода

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

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

Алгоритм LZW, используемый в формате GIF, алгоритмически аналогичен
стандартному алгоритму LZW со следующими отличиями:

Определяется специальный код очистки, который переустанавливает в
исходное состояние все таблицы и параметры процедуры
компрессии/декомпрессии. Этот код имеет значение 2<размер
кода>. Например, если был указан размер кода 4 (для
кодировки каждого пиксела в изображении отводилось 4 бита), то код
очистки соответственно должен быть равен 16 (или 10000 в двоичной
системе счисления). Код очистки может появиться в любом месте потока
графических данных, если это произошло, то алгоритм LZW должен теперь
начать обработку получаемых им кодов так, как будто с этого места
начался новый поток данных. Для каждого формируемого потока графических
данных кодировщик должен на первом месте ставить код очистки.
Очевидно, код «End of Information» явным образом объявляет
конец потока графических данных. По получении этого кода
программа LZW прекращает свою работу. Именно этот код должен быть
последним в потоке данных, полученном на выходе кодировщика. Значение
этого кода равно <Код очистки>+1.
Первый доступный код компрессии = <Код очистки>+2.
Коды, получающиеся на выходе программы, имеют переменную длину, от
<размер кода>+1 на каждый код (первоначально), до 12 бит. Таким
образом, максимальное значение кода составляет 4095 (0xFFF). При
обработке данных всякий раз, когда значение LZW кода начинает выходить
за рамки установленного размера, последний автоматически увеличивается
на единицу. После этого процедура компрессии/декомпрессии данных
должна также пройти перенастройку в соответствии с новым размером кода.

Процедура компоновки 8 бит в байтах

Поскольку в результате LZW-компрессии, согласно формату GIF,
генерируется массив кодов переменной длины — от 3 до 12 бит, то
возникает необходимость в преобразовании этого массива в
последовательную цепочку байтов, где все 8 бит были бы значащими, и эту
последовательность можно было бы реально записать на диск или передать
адресату. Попутно осуществляется также дополнительная компрессии
графических данных. Для выполнения этой операции коды преобразуются в
поток отдельных битов (порядок паковки — справа налево), а затем такой
поток делится программой на одинаковые блоки по 8 бит каждый.

Так, если дан массив символов по 8 бит каждый, а для компрессии
данных используются 5-битные коды, то схематически компоновка будет
выглядеть следующим образом:

     +---------------+
  0  |               |    bbbaaaaa
     +---------------+
  1  |               |    dcccccbb
     +---------------+
  2  |               |    eeeedddd
     +---------------+
  3  |               |    ggfffffe
     +---------------+
  4  |               |    hhhhhggg
     +---------------+
           . . .
     +---------------+
  N  |               |
     +---------------+

Заметим однако, что реально схема упаковки будет по ходу дела
меняться при изменении числа бит в коде компрессии, однако основная
заявленная концепция останется прежней.
Упаковка байтов

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

[1]
Ziv, J. and Lempel, A. : «A Universal Algorithm for Sequential
DataCompression», IEEE Transactions on Information Theory, May 1977.
[2]
Welch, T. : «A Technique for High-Performance Data Compression»,
Computer, June 1984.
[3]
Nelson, M.R. : «LZW Data Compression», Dr. Dobb’s Journal,
October 1989.

G. Передача изображений в режиме on-line.

ЗАМЕЧАНИЕ: В настоящее время — 10 июля 1990 года — данная глава
находится в стадии разработки. Изложенные здесь указания должны
использоваться в качестве основополагающих принципов. Программные
коды, написанные на основании этой информации, должны быть
разработаны таким образом, чтобы их легко можно было бы адаптировать
к любым изменениям, которые возникнут во время последующих пересмотров
представленного материала.

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

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

ESC[>0g           0x1B 0x5B 0x3E 0x30 0x67

Сообщение о ресурсах GIF

Сообщение о ресурсах GIF передается декодировщиком в диалоговым
режиме и содержит информацию о возможностях дисплея того компьютера,
на котором работает декодировщик, причем во всех графических режимах,
поддерживаемых программой. Заметим, что это сообщение может относиться
не только к характеристикам экрана монитора, но и к графическому
принтеру. В общем случае сообщение имеет следующий формат:
#version;protocol{;dev, width, height, color-bits, color-res}…

‘#’
Символ-идентифицикатор сообщения о ресурсах GIF.
version
номер версии для формата GIF; первоначально это было ’87a’.
protocol=’0′
декодировщик не поддерживает протокол типа «end-to-end»
при прямой передаче 8-битного потока данных.
protocol=’1′
при непосредственной передаче данных в формате GIF между
источником информации и дисплеем в интерактивном режиме
может использоваться протокол коррекции ошибок CIS B+.
dev = ‘0’
Представлены параметры экрана.
dev = ‘1’
Представлены параметры принтера.
width
Максимальная ширина экрана в пикселах, поддерживаемая дисплеем.
height
Максимальная высота экрана в пикселах, поддерживаемая дисплеем.
color-bits
Сообщает, сколько бит используется для кодировки цвета пиксела.
Очевидно, общее количество возможных цветов составляет
2color-bits.
color-res
Сообщает, сколько бит используется для кодировки цвета в
аппаратно поддерживаемой палитре цветов. Если значение параметра
color-res равно ‘0’, то это означает, что на аппаратном уровне
отсутствует поддержка таблицы цветов.

Заметим, что все параметры, указанные в сообщении о ресурсах,
записываются в виде чисел в десятичной системе счисления и в кодировке
ASCII, а также что все сообщения о ресурсах заканчиваются символом
возврата каретки.

Представленное далее сообщение о ресурсах GIF дает описание трех
стандартных конфигураций видеоадаптера Enhanced Graphics Adapter
на компьютере IBM PC без принтера. Поток данных, передаваемых в
формате GIF, может быть обработан с применением протокола коррекции
ошибок:
#87a;1;0,320,200,4,0;0,640,200,2,2;0,640,350,4,2
Запуск графического режима GIF

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

ESC[>1g
Вывод GIF изображения на экран
0x1B 0x5B 0x3E 0x31 0x67

ESC[>2g

Вывод изображения непосредственно на подключенный к компьютеру
графический принтер. По умолчанию печатаемое изображение может быть
выведено также и на экран.
0x1B 0x5B 0x3E 0x32 0x67

Заметим, что символ ‘g’, которым заканчивается каждая из представленных
последовательностей, записывается в нижнем регистре.
Внешние условия взаимодействия программ

Предполагается, что внешнее окружение позволяет во время организации
взаимодействия программ и передачи графических данных в формате GIF
организовать полноценный 8-битный поток данных от источника к
получателю. Иными словами, всегда имеется возможность передать все 256
кодов ASCII. О создании коммуникаций в режиме передачи 8-битных данных,
как правило,обычно должна заботиться прикладная программа, запущенная со
стороны отправителя. Коммуникационная программа, отвечающая за
получение данных в формате GIF, также должна иметь возможность получать
и передавать программе декодирования GIF все 256 значений, возникающие
в случае, когда для кодировки данных используются все 8 бит.

Дополнения
*1) Отложенный код очистки в алгоритме LZW компрессии

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

Решение об очистке таблицы принимает кодировщик. Если текущая
таблица заполнена, то кодировщик может просто ее использовать как
есть, не внося более туда никаких изменений, и до тех пор, пока сам же
не решит ее очистить. В последнем случае кодировщик отправляет в поток
данных код, соответствующий максимальному размеру — код очистки.

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

Поскольку имеется большое количество декодировщиков, которые не
осуществляют декомпрессию описанным образом, мы просим разработчиков
программ, выполняющих кодировку в формате GIF, НЕ ПРИМЕНЯТЬ
этот механизм, по крайней мере до января 1991 года и позже, если они
видят, что реально существующий рынок программ еще не готов к этому.
Тем самым разработчикам программ декодирования формата GIF отпускается
время на реализацию описанного механизма и передачу его в руки клиентов
до того момента, как применяемые декодировщики начнут «ломаться» на
новом формате GIF. С другой стороны, это совсем не обязывает
разработчиков менять текст своих кодировщиков с тем, чтобы непременно
воспользоваться преимуществом отложенного кода очистки, однако
разработчики декодировщиков это сделать обязаны.

*2) Блок расширения для приложений — идентификатор приложения

На сервере фирмы CompuServe в документах форума PICS будет создан
файл Courtesy Directory. В этом справочнике будут содержаться
идентификаторы дополнительных блоков приложений, которыми должны
пользоваться разработчики приложений для формата GIF. Данный документ
предназначен для того, чтобы специалисты, независимо друг от друга
разрабатывающие дополнительные блоки приложений, не воспользовались
для их обозначения своих программ одним и тем же идентификатором.
Предложенный документ не является официальным реестром и создается
исключительно на добровольных началах, а стало быть не дает полной
гарантии того, что различные группы разработчиков все же не
воспользуются одним и тем же идентификатором.

Электронную почту с просьбой о включении в эту картотеку вашего
идентификатора можно направлять Ларри Вуду (Larry Wood) — менеджеру
форума PICS.