прочтите этот 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