Декодировать байты данных потока растровых данных GIF87a

Я пытаюсь декодировать байты данных из потока растровых данных GIF87a. Я не уверен, как читать коды переменной длины LZW (и как LSB... наименее значащий байт подходит к этому). Поток растровых данных начинается следующим образом (в шестнадцатеричном формате):

06 6b 40 86 70 48 2c 1a 8f 44 4b 44 22 89 58 8e 10 c7 e1 80
  • 06 -> размер кода 6
  • 6b -> количество байтов в блоке 107
  • 40 -> очистить код (2 ^ 6), который равен 64 в десятичном или 40 в шестнадцатеричном формате.
  • 86 -> начало фактических данных

Спецификация GIF87a: http://www.w3.org/Graphics/GIF/spec-gif87.txt

Поток растров должен иметь индексы, указывающие на глобальную карту (или на родителя в дереве LZW)... но я не уверен, как это читать.

Может ли кто-нибудь преобразовать первые несколько байтов (начиная с 86) в качестве примера?


person Eugene    schedule 16.08.2012    source источник
comment
Вы можете изучить какой-нибудь существующий код. Вот тот, который я использовал в свое время: read.pudn .com/downloads3/sourcecode/graph/9721/DECODER.C__.htm Таблица декодирования начинается с известного состояния и обновляется по мере декодирования каждого нового кода, точно так же, как таблица обновлялась при кодировании. . В этом прелесть LZW.   -  person Mark Ransom    schedule 16.08.2012
comment
@MarkRansom Спасибо за ссылку! Многие примеры декодирования, которые я нашел, слишком оптимизированы, чтобы их было легко читать.   -  person Eugene    schedule 16.08.2012
comment
P.S. Я нашел ошибку в этой функции много лет назад, не знаю, исправлена ​​ли она в этой копии. Это было случайное или что-то подобное, и это не появлялось очень часто.   -  person Mark Ransom    schedule 16.08.2012


Ответы (1)


прочтите этот 3MF Project GIF и все подразделы, там есть все необходимое с пошаговыми примерами и остальное в спецфайле.

теперь данные изображения

Поток данных начинается с размера блока 1 байт, а затем идет битовый поток. В конце идет другой размер блока. Он останавливается, когда вы рисуете весь кадр, а затем устанавливаете указатель после последнего прочитанного блока.

если вы нашли размер блока 0, то это означает конец данных кадра. Если после него стоит терминатор 0x3b, то достигнут конец файла.

Локальные биты цвета говорят вам, сколько битов у вас есть на код в потоке при запуске.

Я читаю LSB фактического обработанного BYTE, затем сдвигаю его вправо, затем сдвигаю код вправо и добавляю этот бит как MSB. После того, как вы достигнете необходимого количества бит индекса, обработайте его с помощью распаковки LZW, а также добавьте новый код в словарь.

если словарь пересекает границу 2 ^ бит, увеличьте размер кода и продолжите. Не забывайте обрабатывать четкие и завершающие специальные коды...

Итак, у вас есть: 06 6b 40 86 70 48 2c 1a

  • 06h - это начальный размер в битах - 1, поэтому реальный размер в битах равен 7 !!!
  • 6bh - размер блока в байтах
  • 40h - это чистый код (это означает, что в таблице color[] присутствует 64 цвета, а первый свободный индекс равен 66)
  • 86 70 48 2c 1a [hex]= |1 0000110|01 110000|010 01000|0010 1100|00011 010| [bin]

Итак, коды:

  • |0000110|110000 1|01000 01|1100 010|010 0010| [bin]
  • |0000110|1100001 |0100001 |11000010|0100010 | [bin]
  • 06,61,21,c2,22 [hex]

61h предлагает ошибку в данных, это действительно начало данных изображения (или я где-то ошибся)? Код может быть только на один больше максимального индекса в словаре. Словарь увеличивается на каждый код, кроме первого, поэтому при обработке 61h словарь имеет размер только 42h. Попробуйте пример на связанной странице, они работают...

person Spektre    schedule 28.04.2015