У меня есть 10x10 gif, который состоит из 4 цветов, белого, красного, синего, черного. Я анализироваться данные GIF нижеНужна помощь в распаковке растровых данных GIF
4749 4638 3961 <-- header
0a00 0a00 9100 00 <-- lsd (pb 91 = 1001 0001) nColors = 4, bytes = 12
ffffff ff0000 0000ff 000000 <-- global color table
#0 FF FF FF
#1 FF 00 00
#2 00 00 FF
#3 00 00 00
21f9 04(00) (0000) (00)00 <-- graphics control extension
(00) = pb (000 reserved 000 disposal method 0 user input flag 0 transparent color flag)
(0000) = delay time
(00) = transparent color index
2c 0000 0000 0a00 0a00 00 <-- image descriptor
02 16 <-- (image data - 02 = lzw min code size, 0x16 size of image (bytes))
8c2d 9987 2a1c dc33 a002 75ec 95fa a8de 608c 0491 4c01 00 <-- image block
3b
Хорошо, таким образом у нас есть данные изображения выше (блок, помеченный изображение), и я пытаюсь распаковать это так, что я получаю исходное изображение обратно. Я понимаю, что вы читаете байты слева направо и биты справа налево, начиная с lzwmincodesize + 1 (2 + 1 бит = 3 бита за раз).
Это алгоритм декомпрессии Я следую
Initialize code table
let CODE be the first code in the code stream
output {CODE} to index stream
<LOOP POINT>
let CODE be the next code in the code stream
is CODE in the code table?
Yes:
output {CODE} to index stream
let K be the first index in {CODE}
add {CODE-1}+K to the code table
No:
let K be the first index of {CODE-1}
output {CODE-1}+K to index stream
add {CODE-1}+K to code table
return to LOOP POINT
Я пошагового алгоритма декомпрессии и вот что я придумал до сих пор ... (начиная с первых 3 байт-кодов)
Global Color Table
000 FF FF FF
001 FF 00 00
010 00 00 FF
011 00 00 00
100 CLEAR
101 End of Data
3 2 1 6 5 4 8 7
10|001|100 0|010|110|1 100|110|01
last current output cindex exists dictionary value
100 4 CLEAR
100 001 001 1 y RED
001 110 001 001 6 n +001 001 RED RED
001 001 110 001 001 6 y +001 001 001 RED RED
001 001 010 010 2 y +001 001 010 BLUE
010 010 010 2 y +010 010 BLUE
010 110 001 001 6 y +010 001 001 RED RED
001 001 100 4 CLEAR
100 111 111 7 ???? <--- (what do I do here)?
я должен получать 5 значений красного, а затем 5 значения синего в течение первых 10 пикселей, но, как вы можете видеть, он декодирует 5 красных затем 2 синие затем 2 красным. Может ли кто-нибудь указать, что я здесь делаю неправильно?
Thanks
как вы сохранили следующий код? мой следующий поток кода выйдет вот так? 110 110 010 010 110 100 111 – sc2bigjoe
Для каждого кода, который не является четким кодом, а не первым кодом после cc, вы увеличиваете переменную «nextcode». – BitBank
Итак, вот код stream 10001100 00101101 10011001 10000111. Вот как следующая переменная кода выравнивается для меня для каждого кода, который не является cc, а не первым кодом после cc. код: 100 001 110 110 010 100 (cc read и 111 следующий код) следующий код: 110 110 010 010 110 111 (что вы говорите, чтобы пропустить) , если я попытаюсь следовать этому с моим алгоритмом, его выход еще не верна. – sc2bigjoe