Если ты путешествуешь в Internet, то не раз видел анимацию выполненную с использованием GIF файлов. Этот формат стал одним из распространённых в сети Internet. И всё это благодаря своим достоинствам:
Высокая степень сжатия при не сложном алгоритме как в понимании, так и в реализации.
Высокая степень сжатия без потери качества.
Возможность создания анимированных картинок.
На время написания этой статьи, на страничке этого журнала все картинки были созданы с помощью CyD GIF Studio Pro и хранились в GIF формате.
По степени сжатия, с GIF файлами могут конкурировать только JPG (JPEG). Но вторые сжимаются с потерей качества, и при высокой степени сжатия эти потери очень сильно ощутимы. Поэтому JPEG используют только для хранения больших картинок, не требовательных к качеству.
Рис 1. Структура GIF файла
Для начала посмотрим на рисунок 1. На нём представлена структура GIF файла. Обрати внимание, что дескриптор изображения, локальная палитра и растровые данные могут повторяться сколько угодно раз. Как раз это свойство и позволяет создавать анимированные изображения.
При изучении статьи ты должен внимательно следить за дескрипторами о которых я говорю. Ты не должен путать дескриптор изображения и дескриптор экрана. Теперь рассмотрим всё по порядку.
Сигнатура файла. В различной литературе здесь может использоваться разные обозначения, но я привык именно к такому. Сигнатура - это подпись файла, которая подтверждает, что это действительно GIF файл. Размер сигнатуры равен 6 байтам. Я не знаю зачем так много, но видимо так надо. На данный момент сигнатура может иметь два значения: GIF89a или GIF87a . Первые три байта говорят, что перед нами файл формата GIF. Вторые три байта показывают версию файла.
Дескриптор экрана . Здесь хранятся общие параметры для хранящихся в файле изображений. Здесь определены размеры изображения, существование таблицы цветов и их глубина. На рисунке 2 представлена схема дескриптора экрана. Как ты можешь видеть, все поля имеют размер в один байт.
Рис 2. Дескр. экрана.
Первый и второй байт это ширина, а второй и третий - высота. Ширина и высота логического экрана могут быть больше размеров физического. Как в этом случае будет высвечиваться изображение, будет зависеть от программы реализующей этот формат.
В пятом байте хранится сразу несколько параметров
М (1 бит) если равен единице, то после дескриптора идёт глобальная таблица цветов.
cr (3 бита) если к этому значению прибавить 1, то получается число битов цветового разрешения.
Следующий бит всегда равен нулю.
pixel (3 бита) Если прибавить единицу, то получим число бит/пиксель. Диапазон значений от 0 до 7, то есть если мы прибавим "1" то получим максимальную глубину цвета в 256 цветов. В наше время это уже маловато, но что поделаешь. Формат разрабатывался более десяти лет назад.
После этого идёт фон (1-й байт) - индекс цвета в глобальной таблице цветов (если её нет, то значение берётся из палитры, используемой по умолчанию) используемый в качестве фона.
Последний байт нулевой, т.е. зарезервирован до лучших времён.
Глобальная палитра Глобальная палитра может и не существовать. О её существовании говорит поле "М" в пятом байте дескриптора экрана. Эта палитра может быть связана со всеми изображениями или с некоторыми из них. Число элементов палитры равно 2 в степени (число бит/пиксел). Каждый элемент состоит из трёх байтов: интенсивность красного, зелёного и синего.
Дескриптор изображения - определяет расположение и размеры внутри пространства описанного в дескрипторе экрана. Помимо этого, здесь хранятся флаги присутствия локальной палитры (если её нет, то используется глобальная) и последовательность высвечивания пикселов. Структура дескриптора изображения показана на рисунке 3.
Рис 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 . Расширенный блок может находиться как перед дескриптором изображения, так и после изображения, н перед терминатором. Расширенный блок состоит из: