VR
Virtual Reality On-line   Журнал
Новости   |     Журнал    |    Хаkер    |     Магазин   |   Проекты
[   Вход    ]
[Kарта сайтa]

[ Download  ]
[  Конкурс  ]
[ Анекдоты  ]
[  Ссылки   ]
[  Реклама  ]
[ Почтальон ]
[ О проекте ]






TopList
Форматы данных
графический формат GIF
:

Если ты путешествуешь в Internet, то не раз видел анимацию выполненную с использованием GIF файлов. Этот формат стал одним из распространённых в сети Internet. И всё это благодаря своим достоинствам:

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

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

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

Для начала посмотрим на рисунок 1. На нём представлена структура GIF файла. Обрати внимание, что дескриптор изображения, локальная палитра и растровые данные могут повторяться сколько угодно раз. Как раз это свойство и позволяет создавать анимированные изображения.

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

Сигнатура файла. В различной литературе здесь может использоваться разные обозначения, но я привык именно к такому. Сигнатура - это подпись файла, которая подтверждает, что это действительно GIF файл. Размер сигнатуры равен 6 байтам. Я не знаю зачем так много, но видимо так надо. На данный момент сигнатура может иметь два значения: GIF89a или GIF87a . Первые три байта говорят, что перед нами файл формата GIF. Вторые три байта показывают версию файла.

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

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

В пятом байте хранится сразу несколько параметров

  1. М (1 бит) если равен единице, то после дескриптора идёт глобальная таблица цветов.
  2. cr (3 бита) если к этому значению прибавить 1, то получается число битов цветового разрешения.
  3. Следующий бит всегда равен нулю.
  4. pixel (3 бита) Если прибавить единицу, то получим число бит/пиксель. Диапазон значений от 0 до 7, то есть если мы прибавим "1" то получим максимальную глубину цвета в 256 цветов. В наше время это уже маловато, но что поделаешь. Формат разрабатывался более десяти лет назад.

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

Последний байт нулевой, т.е. зарезервирован до лучших времён.

Глобальная палитра Глобальная палитра может и не существовать. О её существовании говорит поле "М" в пятом байте дескриптора экрана. Эта палитра может быть связана со всеми изображениями или с некоторыми из них. Число элементов палитры равно 2 в степени (число бит/пиксел). Каждый элемент состоит из трёх байтов: интенсивность красного, зелёного и синего.

Дескриптор изображения - определяет расположение и размеры внутри пространства описанного в дескрипторе экрана. Помимо этого, здесь хранятся флаги присутствия локальной палитры (если её нет, то используется глобальная) и последовательность высвечивания пикселов. Структура дескриптора изображения показана на рисунке 3.
Logo
Рис 3. Дескр. изображ.

Рассмотрим подробнее:

  • 1-й байт - это разделитель изображений (шестнадцатеричная 0x2C).
  • 2-й и 3-й байт. Начало изображения в пикселах относительно левого края экрана.
  • 4-й и 5-й байт. Начало изображения в пикселах относительно верхнего края экрана.
  • 6-й и 7-й байт. Ширина изображения в пикселах.
  • 8-й и 9-й байт. Высота изображения в пикселах.
  • 10-й байт. Хранит флаги изображения:
    • М=1 (1 бит) означает что есть локальная палитра, иначе используется глобальная, а значение pixel этого байта игнорируется.
    • I=0 (1 бит) означает, что растровые данные отформатированы в последовательном порядке, иначе данные переплетены.
    • Далее идут три бита нулевых.
    • pixel (3 бит), если прибавить 1, то получим число бит/пиксель.

Локальная палитра как и глобальная является необязательной. Её присутствие зависит от бита "М" в 10-м байте дескриптора изображения. Эта палитра относиться только к последующим растровым данным. На остальные изображения она не влияет. После отображения растровых данных таблицу цветов и число бот на пиксел нужно вернуть у состоянию, описанному в дескрипторе экрана.

Растровые данные Формат растровых данных определён как серия значений индексов в цветовой палитре. Пикселы хранятся слева на право последовательно по строкам. Если бит "I" в 10-м байте дескриптора изображения равен нулю, то данные записываются последовательно, сверху вниз. Иначе происходит четырёхпроходная запись данных. Сперва записывается каждая восьмая строка, начиная с первой. Потом каждая 8-я, начиная с 5-й строки. На 3-м этапе записывается каждая четвёртая, и на последнем этапе записывается каждая 2-я строка. Растровые данный сжимаются по алгоритму сжатия LZW.

Терминатор Шестнадцатеричное 0х3В означает конец изображения. Если в файле только одно изображение, то это конец файла. Если изображений несколько, то после терминатора начинается следующее изображение.

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

  • (1 байт) Идентификатор расширенного блока - 00100001
  • (1 байт) Функциональный код
  • (1 байт) Байт счётчик
  • Данные

Байт счётчик и данные могут повторяться много раз, происходит это, пока не встретиться нулевой байт счётчик.

И это ещё не всё. В следующем номере мы познакомимся с алгоритмом сжатия LZW, с помощью которого сжимаются GIF файлы.


Design by FMk group ©
Copyright©: Horrific aka Флёнов Михаил ©