 |
быть на один бит длиннее.
СЖАТИЕ
Алгоритм LZW преобразует серию значений данных в серию кодов,
которые могут быть самими значениями или кодами, описывающими
серию значений. Если использовать аналогию с текстовыми символами,
то выходные коды состоят из символов и кодов, которые описывают
цепочки символов.
- 13 -
LZW-алгоритм, использованный в GIF алгоритмически
соответствует стандартному алгоритму LZW со следующими отличиями:
1. Определен специальный код очистки, который сбрасывает все
параметры сжатия/раскрытия и таблицы в исходное состояние.
Значение этого кода равно 2**<код размера>. Например, если код
размера равен 4 (изображение имеет 4 бита на пиксел), код
очистки равен 16 (двоичное 10000). Код очистки может
появляться в любом месте потока данных и, следовательно,
требуется, чтобы LZW-алгоритм обрабатывал последующие коды
так, как будто бы начался новый поток данных. Кодировщик
должен выводить код очистки в качестве первого кода в каждом
потоке данных изображения.
2. Определен код конца информации, который явно указывает на
конец потока данных изображения. Если встретится такой код,
LZW-обработка прекращается. Этот код должен быть последним
кодом, формируемым кодировщиком для изображения. Значение
этого кода равно <Код_очистки>+1.
3. Значение первого доступного кода сжатия равно <Код_очистки>+2.
4. Выходные коды имеют переменную длину, начиная от
<код_размера>+1 битов на код, до 12 битов на код. Тем самым
максимальное значение кода определяется равным 4095
(шестнадцатиричное FFF). Как только значение LZW-кода может
превысить текущую длину кода, длина кода увеличивается на
единицу. Паковщик и распаковщик этих кодов должны изменяться,
чтобы соответствовать новой длине кода.
ПОСТРОЕНИЕ 8-БИТНЫХ БАЙТОВ
Поскольку LZW-сжатие, используемое для GIF, создает серию
кодов переменной длины от 3 до 12 символов каждый, эти коды должны
быть переформированы в серию 8-битный байтов так, чтобы на самом
деле происходило запоминание или передача символов. Это
обеспечивает дополнительное сжатие изображения. Коды формируются в
поток битов так, как если бы они паковались справа налево, и затем
выбираются по 8 битов для вывода. Рассматриваемый массив 8-битных
символов при упаковке кодов длиной по 5 битов должен быть похож на
следующий пример:
байт n байт 5 байт 4 байт 3 байт 2 байт 1
ЪД.....ДДДДД+ДДДДДДДД+ДДДДДДДД+ДДДДДДДД+ДДДДДДДД+ДДДДДДДДї
і and so on іhhhhhgggіggfffffeіeeeeddddіdcccccbbіbbbaaaaaі
АД.....ДДДДД+ДДДДДДДД+ДДДДДДДД+ДДДДДДДД+ДДДДДДДД+ДДДДДДДДЩ
Заметьте, что механизм физической упаковки будет изменяться
по мере того, как изменяется число битов в коде сжатия, но
концептуально он остается тем же самым.
- 14 -
УПАКОВКА БАЙТОВ
Как только байты созданы, они группируются в блоки для
вывода, причем каждому блоку предшествует байт-счетчик со
значением от 0 до 255. Блок с нулевым байтом-счетчиком заканчивает
поток данных для данного изображения. Эти блоки являются тем, что
выводится на самом деле в формате GIF. Такой формат блока
обеспечивает дополнительную эффективность за счет того, что
позволяет декодировщику считывать данные по мере необходимости,
читая сначала байт-счетчик, а затем пропуская сами данные об
изображении.
- 15 -
ПРИЛОЖЕНИЕ D
ОБРАБОТКА НЕСКОЛЬКИХ ИЗОБРАЖЕНИЙ
Поскольку поток данных GIF может содержать несколько
изображений, необходимо описать обработку и высвечивание таких
файлов. Поскольку дескриптор изображения допускает размещение
изображения в пределах логического экрана, можно определить
последовательность изображений, каждое из которых занимает часть
экрана, но их совокупность заполняет экран целиком. В подобных
ситуациях линии поведения при обработке изображений состоит в
следующем:
1. Не делать пауз между изображениями. Каждое обрабатывается
сразу же, как только будет распознано декодировщиком.
2. Каждое изображение переписывает любое другое изображение уже
находящееся внутри его окна. Экран очищается только в начале и
в конце обработки GIF-изображений. См. обсуждение терминатора
GIF.
|