Формат GIF - отдельные коды переменной длины - PullRequest
1 голос
/ 04 мая 2011

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

например:

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

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

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

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

...

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

...

Ответы [ 2 ]

2 голосов
/ 30 мая 2011

При синтаксическом анализе файла 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-битные коды.

1 голос
/ 04 мая 2011

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

...