Декодировать байты данных потока растровых данных 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
по размеру. Попробуйте пример на связанной странице, они работают...