Формат GIF - отдельные коды переменной длины

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

ex:

0010-1010-0010-0000-00111-10000-11111...

Иногда длина кода увеличивается, но я не могу понять, как я могу обнаружить это увеличение. У меня есть только начальный размер кода (длина первого кода, например 4).

Стандарт говорит только:

Приложение F. LZW-сжатие кода переменной длины.

...

Аспект кода переменной длины алгоритма основан на начальном размере кода (начальный размер кода LZW), который указывает начальное количество битов, используемых для кодов сжатия. Когда количество паттернов, обнаруженных компрессором во входном потоке, превышает количество паттернов, кодируемых текущим количеством битов, количество битов на код LZW увеличивается на единицу.

...


person skkap    schedule 03.05.2011    source источник


Ответы (2)


При анализе файла GIF дескриптор изображения включает разрядность незакодированных символов (пример: 8 бит). Как вы, вероятно, уже знаете, исходный размер кода сжатых данных на один бит больше, чем разрядность незакодированных символов (пример: 9 бит).

Кроме того, как вы, вероятно, уже знаете, возможные значения сжатого кода в файле GIF постепенно увеличиваются в размере, вплоть до максимального значения 0xFFF == 4095, для хранения которого требуется 12 бит.

Для каждого кода, который декомпрессор извлекает из сжатых данных, декомпрессор добавляет новый элемент в свой словарь. Например, если декомпрессор считывает первые два 9-битных кода 0x028 0x0FF, декомпрессор добавляет двухбайтовую последовательность в свой словарь. Позже, если декомпрессор когда-либо считывает код 0x102, декомпрессор декодирует этот код 0x102 в два 8-битных байта 0x28 0xFF.

Следующему элементу, который декомпрессор добавляет в словарь, присваивается код 0x103.

Следующему элементу, который декомпрессор добавляет в словарь, присваивается код 0x104. ...

В конце концов декомпрессор добавляет в словарь элемент, которому присваивается код 0x1FF. Это самое большое число, которое помещается в 9 бит. После сохранения этого элемента в словаре декомпрессор начинает считывать 10-битные коды.

Следующему элементу, который декомпрессор добавляет в словарь, присваивается код 0x200.

В последовательности данных нет какой-либо специальной «команды», которая сообщает распаковщику увеличить ширину кода. Декомпрессор должен отслеживать, сколько элементов словарь содержит на данный момент (что часто может быть удобно повторно использовано в качестве указателя того, куда записать следующий элемент в словарь). Когда декомпрессор добавляет в словарь элемент 0x1ff, декомпрессору пора начинать считывать 10-битные коды. Когда декомпрессор добавляет элемент 0x3ff в словарь, декомпрессору пора начинать считывать 11-битные коды.

person David Cary    schedule 30.05.2011

Посмотрите сначала на этот пример, возможно, так будет понятнее LZW. чем смотреть стандарт. И это также может быть полезно.

person DreamOfMirrors    schedule 03.05.2011
comment
Я прочитал стандарт и цитирую его в своем вопросе, но я все еще не могу этого понять. Мне не нужно понимать алгоритм LZW (ваша первая ссылка), у меня есть вопрос только об этом коде переменной длины в формате файла GIF, пожалуйста, объясните мне это - person skkap; 04.05.2011
comment
Я думаю, вы должны прочитать что-нибудь о кодировании Хаффмана, есть способ, используя такое кодирование для уникального различать фрагменты кода переменной длины без границ. Нечто подобное использовалось в телефонных префиксах и номерах, взгляните на мою ссылку и попытайтесь понять, как это работает. - person DreamOfMirrors; 05.05.2011