четверг, 21 июня 2012 г.

Даешь максимальное сжатие! Формат GIF


Общая информация

Графический растровый формат GIF (Graphics Image Format) был создан фирмой CompuServe Inc. для размещения изображений в компьютерных сетях. Особенно широко формат GIF используется для размещения изображений в Web. Несмотря на все возрастающую пропускную способность компьютерных сетей, объем изображений стоит достаточно остро.
GIF - один из немногих форматов, использующих эффективный алгоритм сжатия, почти не уступающий программам-архиваторам. Методики уменьшения объема изображения в GIF не исчерпываются одной лишь компрессией данных, он позволяет произвольно задавать количество цветов (или размер палитры) используемых в изображении.
Изображения формата GIF имеют блочную структуру. Это значит, что они состоят из отдельных блоков, которые в большинстве случаев никак не связаны друг с другом. Программы, не распознающие некоторые типы блоков, могут просто пропускать их - для этого у каждого нестандартного блока в заголовке указан его размер. Идущие один за другим блоки, описывающие изображения сменяют друг друга на экране и создают иллюзию движения. До или после них (или даже между ними) в файле могут находиться другие блоки.

Формат GIF позволяет хранить растровые данные в пикселях с глубиной цвета от 1 до 8 бит. Изображения записываются с применением цветовой модели RGB и данных палитры. Формат позволяет хранить изображения размером до 64000 пикселов, выбирать 256 цветов в 64 миллионной палитре, обеспечивает быструю распаковку при просмотре, эффективное сжатие и аппаратную независимость. Формат позволяет хранить в одном файле несколько изображений, но эта возможность, как правило, используется при создании анимации.
Существуют две спецификации GIF. Первая относится к формату GIF87а, в котором предусматривается запись множества изображений, и GIF89а, который ориентирован на хранение как текстовых, так и графических данных в одном файле.
GIF87a предусматривал следующие возможности GIF-файла:
  • Чередование (interlacing). Вначале загружается только "остов" изображения, потом, по мере загрузки, оно детализируется. Это позволяет на медленных линиях не грузить весь графический файл целиком для того, чтобы получить о нем представление.
  • Сжатие (compression) по алгоритму LZW. Эта черта GIF-файлов держит их в лидерах по наименьшему объему файла.
  • Размещение нескольких изображений в одном файле.
  • Расположение изображения на логическом экране. То есть, формат позволял определить логическую экранную область для вывода изображений, и помещать их в произвольном месте этой области. В дальнейшем, этот стандарт был расширен спецификацией GIF89a, которая добавила следующие возможности:
  • Включение в графический файл комментариев (не отображаются на экране, но могут быть прочитаны программой, поддерживающей GIF89a).
  • Управление задержкой перед сменой кадров (задается в 1/100 секунды, или ожидание ввода пользователя). 
  • Управление удалением предыдущего изображения. Предыдущее изображение может быть оставлено, заменено на цвет фона или на то, что было перед ним.
  • Определение прозрачного цвета.
  • Вывод текста.
  • Создание управляющих блоков прикладными программами (application-specific extensions). Внутри GIF-файла можно создать блок, который будет игнорироваться всеми программами, кроме той, для которой он предназначен.

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


Каждый файл начинается с заголовка и описания (дескриптора), после которых может следовать глобальная палитра. Каждый из этих разделов имеет постоянное смещение от начала файла. Любое изображение, записанное в файле, содержит собственное локальное описание, локальную палитру (необязательно) и блок данных. Последним полем в формате GIF является символ завершения, который указывает конец данных GIF.
Заголовок имеет длину 6 байтов и применяется для идентификации файла GIF.
Дескриптор файла включает данные о: ширине и высоте отображаемого изображения в пикселах, информацию об изображении и цветовой таблице, индекс цвета фона и коэффициент сжатия.
Структура GIF-файла
Глобальная палитра является необязательной и рекомендуется для изображений, где требуется точная передача цветов
После заголовка, дескриптора и глобальной палитры следуют один или несколько разделов данных изображения. Каждое изображение в файле GIF записывается отдельно, со своими описанием изображения и локальной палитрой.
Локальное описание изображения размещено перед соответствующим разделом данных для конкретного изображения. Каждое описание изображения начинается с символа-разделителя изображений. Роль разделителя изображений состоит в синхронизации при входе в дескриптор изображения.
Локальный дескриптор изображения включает в себя, идентификатор дескриптора изображения, положение изображения на экране по оси Х и Y, ширина и высота изображения в пикселах, информация об изображении и цветовая палитры.
В разделе «Информация об изображении» определяются флаги, указывающие на присутствие локальной палитры  и определения последовательности отрисовки пикселов при загрузке изображения по сети.
Данные изображения GIF последовательно и с использованием чередования строк. В первом случае строки растровых данных последовательно записываются начиная с первой строки и до последней. В режиме чередования строки развертки представляются в следующем порядке: сначала записываются все четные строки, а затем – все нечетные.
Данные изображения в файле GIF сжаты с использованием схемы кодирования LWZ, использующей алгоритм сжатия, характерный для большинства архиваторов файлов.  Обычно LWZ – кодированные данные изображения в графическом файле упорядочиваются в непрерывный поток и читаются от начала до конца. Однако формат GIF хранит кодированные данные изображения в виде последовательностей подблоков данных.
Каждый подблок данных начинается со счетчика байтов. Значение счетчика может изменяться в диапазоне от 1 до 255, определяя количество байтов данных в этом подблоке. Данные подблока следуют непосредственно за счетчиком байтов. Непрерывная группа подблоков данных завершается байтом с нулевым значением. Этот байт может рассматриваться либо как символ – ограничитель, либо как подблок со значением счетчика, равным 0. В обоих случаях он указывает на то, что данных больше нет.
Декодированные данные изображения GIF отличаются довольно простым форматом. Каждый пиксель в декодированной строке развертки всегда имеет размер 1 байт и содержит значение индекса из глобальной или локальной палитры.
Терминатор GIF. Для фиксации процесса окончания файла изображения GIF, используется один байт данных, который рассматривается как последний символ файла. Значение этого байта всегда равно 3Bh (шестнадцатеричный код символа ";"). Терминатор (или завершитель) воспринимается декодером GIF как сигнал окончание процесса обработки изображения. Он должен присутствовать в каждом файле GIF.

2 комментария:

  1. Тоже занимался оптимизацией gif.
    В итоге в моем случае получилось, что оптимально жать в видео формата webm.
    Мои эксперименты описаны здесь http://forum.ubuntu.ru/index.php?topic=229155.0

    ОтветитьУдалить
    Ответы
    1. по поводу webm давно никто не сомневается, странно что поддержка в железе его практически отсутствует

      Удалить