Декодировать байты данных потока растровых данных 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 spec: http://www.w3.org/Graphics/GIF/spec-gif87.txt

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

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

1 ответ

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

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

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

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

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

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

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

Так что у тебя есть: 06 6b 40 86 70 48 2c 1a

  • 06h это начальный размер бита - 1, поэтому реальный размер бита 7!!!
  • 6bh размер блока в байтах
  • 40h ясный код (имеется в виду 64 цвета color[] таблица, и первый свободный индекс составляет 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 по размеру. Попробуйте пример на связанной странице, они работают...

Другие вопросы по тегам