4.1 Растровый формат GIF

Файловый растровый формат GIF (Graphics Image Format) был предложен фирмой CompuServe Inc. для протокола передачи цветных изображений в глобальных сетях. С его помощью организуется обмен графическими и содержащими элементы графики файлами. Этот формат используется для хранения нескольких растровых изображений в одном файле и применяется для обмена растровыми данными между платформами и системами.

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

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

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

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

Резервы экономии в GIF не исчерпываются одной лишь компрессией данных. Одной из особенностей этого формата является то, что он позволяет произвольно задавать количество цветов, или размер палитры, используемой в изображении. Другие форматы, как правило, имеют лишь стандартные градации цветовой глубины: 2 цвета, 16 цветов, 256, 215 (режим "high color") и 224 (режим "true color"). GIF же может иметь любое количество цветов от 2 до 256, и если в изображении используется, например, 64 цвета (26), то для хранения каждого пиксела будет использовано шесть бит.

Еще одна особенность формата GIF состоит в том, что разработчики изменили порядок следования данных в файле. За счет этого передаваемое изображение рисуется сверху вниз с изменением четкости и детальности. То есть изображение становиться все четче и детальнее по мере поступления информации из сети. Для этого файл изображения формируется при записи так, чтобы сначала шли все строки пикселов с номерами, кратными восьми (первый проход), затем четырем (второй проход), потом двум, и, наконец, последний проход - все оставшиеся строки с нечетными номерами. Во время приема и декодирования такого файла каждый следующий проход заполняет "пропуски" в предыдущих, постепенно приближая изображение к исходному состоянию. Нечто подобное используется в телевидении для передачи одного полного кадра полукадрами (так называемая "чересстрочная развертка"). Поэтому такие изображения были названы чересстрочными (interlaced).

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

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

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

Формат GIF позволяет хранить растровые данные в пикселях с глубиной цвета от 1 до 8 бит. Изображения записываются с применением цветовой модели RGB и данных палитры. Формат позволяет хранить изображения размером до 64000 пикселов, выбирать 256 цветов в 64 миллионной палитре, обеспечивает быструю распаковку при просмотре, эффективное сжатие и аппаратную независимость. Формат позволяет хранить в одном файле несколько изображений, но эта возможность, как правило, используется при кодировании анимаций.

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

GIF87a предусматривал следующие возможности GIF-файла:

- Чередование (interlacing). Вначале загружается только "остов" изображения, потом, по мере загрузки, оно детализируется. Это позволяет на медленных линиях не грузить весь графический файл целиком для того, чтобы получить о нем представление.

- Сжатие (compression) по алгоритму LZW. Эта черта GIF-файлов держит их в лидерах по наименьшему объему файла.

- Размещение нескольких изображений в одном файле.

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

В дальнейшем, этот стандарт был расширен спецификацией GIF89a, которая добавила следующие возможности:

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

- Управление задержкой перед сменой кадров (задается в 1/100 секунды, или ожидание ввода пользователя).

- Управление удалением предыдущего изображения. Предыдущее изображение может быть оставлено, заменено на цвет фона или на то, что было перед ним.

- Определение прозрачного цвета.

- Вывод текста.

- Создание управляющих блоков прикладными программами (application-specific extensions). Внутри GIF-файла можно создать блок, который будет игнорироваться всеми программами, кроме той, для которой он предназначен.

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

Основные элементы структуры файла GIF87а представлены на рис. 1.


 


Рис. 1 Структура файлового формата Gif 87а

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

Заголовок имеет длину 6 байтов и применяется для идентификации файла GIF. Заголовок включает: Сигнатуру заголовка  (Signature) и Версию формата (Version) GIF.

Поле Signature  имеет длину 3 байта и содержит в качестве идентификатора обязательные символы «GIF». Ни один из файлов не будет распознан приложением как файл изображения GIF, если он не начинается с этих трех байтов.

Поле Version также имеет длину 3 байта и указывает версию файла GIF (87a или 89а).

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


Рис. 2 Структура дескриптора логического экрана

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

Глобальная цветовая таблица. Эта таблица является необязательной и рекомендуется для изображений, где требуется точная передача цветов. На существование этой таблицы указывает поле M в байте 5 дескриптора экрана. Обычно, глобальная таблица будет использоваться, из-за ограничений, существующих в настоящее время в доступном оборудовании. Флаг M в дескрипторе конкретного изображения обычно равен 0. Если глобальная таблица цветов присутствует, ее определение следует непосредственно за дескриптором экрана. Каждый элемент цветовой таблицы состоит из трех байтов, значения которых описывают соответственно относительную интенсивность красного, зеленого и синего цветов, для каждого пиксела изображения. Структура блока цветовой таблицы представлена на рис. 3.


Рис. 3 Структура блока цветовой таблицы

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

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

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

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

Локальный дескриптор изображения включает следующие компоненты:

- Идентификатор дескриптора изображения.

- Положение изображения на экране по оси Х.

- Положение изображения на экране по оси У.

- Ширина изображения в пикселах.

- Высота изображения в пикселах.

- Информация об изображении и данных цветовой таблицы.

В разделе информации об изображении определяются флаги, указывающие на присутствие локальной таблицы для поиска  цветов  и определения последовательности высвечивания пикселов: флаг локальной цветовой таблицы (бит 0), флаг чередования (бит 1), флаг сортировки (бит 2), размер элемента локальной цветовой таблицы (биты 5 – 7). Биты 3 – 4 зарезервированы.

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

Значение флага чередования равно 1, если строки изображения чередуются, и 0 в противном случае. Данные изображения GIF хранятся в виде строк развертки и попиксельно. Строки развертки, из которых состоит изображение, обычно хранятся в определенной последовательности – с первой по последнюю. Формат GIF поддерживает и альтернативный способ хранения строк растровых данных – в порядке чередования.

На рис.4 представлен порядок строк, записанных обычным способом и по принципу чередования.

Рис.4 Порядок строк


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

GIF использует четырехпроходную схему чередования. Первый проход начинается со строки 0, затем читается восьмая строка растровых данных. Второй проход начинается с четвертой строки, затем вновь читается восьмая строка данных. Третий проход начинается со второй строки, затем читается четвертая. Последний проход начинается с первой и читается вторая. По этой схеме обрабатываются все строки изображения.

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

Значение флага сортировки определяет, отсортированы ли элементы в цветовой таблице по степени их важности. Определяется это частотой появления цвета в изображении. Значение 1 указывает на отсортированную цветовую таблицу, значение 0 – на таблицу с не отсортированными цветовыми элементами. Субполе Флаг сортировки имеет корректное значение только в версии GIF 89a; в версии 87а оно зарезервировано и всегда установлено в 0.

Значение размер элемента локальной цветовой таблицы указывает количество битов на элемент локальной цветовой таблицы

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

Каждый подблок данных начинается со счетчика байтов. Значение счетчика может изменяться в диапазоне от 1 до 255, определяя количество байтов данных в этом подблоке. Данные подблока следуют непосредственно за счетчиком байтов. Непрерывная группа подблоков данных завершается байтом с нулевым значением. Этот байт может рассматриваться либо как символ – ограничитель, либо как подблок со значением счетчика, равным 0. В обоих случаях он указывает на то, что данных больше нет.

Файлы GIF не содержат непрерывного потока закодированных LWZ – данных. Эти данные посылаются декодеру по мере чтения подблоков. Большинство подблоков, в которых хранятся данные изображения, имеют длину 255 байтов. Следовательно, именно этот размер лучше всего подходит для буфера, в котором хранятся закодированные данные изображения.

Декодированные данные изображения GIF отличаются довольно простым форматом. Каждый пиксель в декодированной строке развертки всегда имеет размер 1 байт и содержит значение индекса из Глобальной либо Локальной цветовых таблиц. Структура файла формата GIF допускает хранение цветовой информации непосредственно в данных изображения, но в спецификации GIF подобная возможность не предусмотрена. Поэтому даже 1 – битовые изображения должны использовать 8 – битовое значение индекса и цветовую таблицу из двух элементов.

Терминатор GIF. Для фиксации процесса окончания файла изображения GIF, используется один байт данных, который рассматривается как последний символ файла. Значение этого байта всегда равно 3Bh (шестнадцатеричный код символа ";"). Терминатор (или завершитель) воспринимается декодером GIF как сигнал окончание процесса обработки изображения. Он должен присутствовать в каждом файле GIF.

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

 Обычно декодирующая программа дает команду на прекращение графического режима и возвращается к предыдущему процессу.

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

Рис. 5 Структура блока расширения

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

Формат GIF89a.

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

Структура файла GIF89a. Файл GIF89a состоит из блоков, расположенных в определенной последовательности. Выделяют блоки трех типов:

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

Блоки изображения: изображение, текст, описание палитры - содержат данные для самого изображения.

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

Общая схема следования этих блоков:

-           Заголовок (идентификатор) - определяет формат файла (GIF87a или GIF89a).

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

-                       Описание глобальной палитры (необязательно).

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

-                       Признак конца файла.

Комментарии и специальные блоки могут располагаться где угодно, кроме:

- До описания глобальной палитры (если оно есть) или до описания логического экрана.

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

- После признака конца файла.

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

Резервы экономии в GIF не исчерпываются одной лишь компрессией данных. Одним из главных достоинств этого формата является то, что он позволяет произвольно задавать количество цветов, или размер палитры, используемой в изображении. Другие форматы, как правило, имеют лишь стандартные градации цветовой глубины: 2 цвета, 16 цветов, а потом сразу 256, 215 (режим "high color") и 224 (режим "true color"). GIF же может иметь любое количество цветов от 2 до 256, и если в изображении используется, скажем, 64 цвета (26), то для хранения каждого пикселя будет использовано ровно шесть бит.

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

Нечто подобное используется в телевидении для передачи одного полного кадра за два прохода луча (так называемая "чересстрочная развертка"). Поэтому такие изображения были названы чересстрочными (interlaced).

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

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

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

Hosted by uCoz