我正在尝试解码GIF87a栅格数据流中的数据字节。我不确定如何读取LZW可变长度代码(以及LSB ......最低有效字节如何首先适用于此)。栅格数据流如下所示(十六进制):
06 6b 40 86 70 48 2c 1a 8f 44 4b 44 22 89 58 8e 10 c7 e1 80
GIF87a规范:http://www.w3.org/Graphics/GIF/spec-gif87.txt
栅格流应该有指向全局地图的索引(或指向LZW树中的父级)...但我不确定如何阅读它。
有人可以转换前几个字节(从86开始)作为示例吗?
答案 0 :(得分:0)
阅读此3MF Project GIF,所有子章节都包含了步骤示例所需的一切,其余部分都在规范文件中。
现在是图像数据
流数据以1字节块大小开始,然后转到比特流。最后是另一个块大小。它会在您绘制整个帧然后在最后一个重新执行的块之后设置指针时停止。
如果找到块大小0
,则表示帧数据结束。如果在此之后存在终结符0x3b
,则到达文件末尾。
本地颜色位告诉您启动时流中每个代码有多少位。
我读取实际处理过的BYTE的LSB,然后向右移动然后向右移动代码并将该位添加为它的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
。尝试他们工作的链接页面中的示例...