Image processing 对光栅数据流的数据字节进行解码
我正在尝试从光栅数据流中解码数据字节。我不确定如何读取LZW可变长度代码,以及LSB…最低有效字节如何首先适合这种情况。光栅数据流以十六进制开始,如下所示:Image processing 对光栅数据流的数据字节进行解码,image-processing,decode,gif,specifications,lzw,Image Processing,Decode,Gif,Specifications,Lzw,我正在尝试从光栅数据流中解码数据字节。我不确定如何读取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->清除十进制64或十六进制40的代码2^6 86->实际数据的开始 GIF87a规格: 光栅流应该有指向全局地图或LZW树中父级的索引…但我不确定如何读取它 是否有
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->清除十进制64或十六进制40的代码2^6
86->实际数据的开始
GIF87a规格:
光栅流应该有指向全局地图或LZW树中父级的索引…但我不确定如何读取它
是否有人可以转换从86开始的前几个字节作为一个示例?阅读此部分和所有子部分,这些都是步骤示例所需的所有内容,其余部分在spec文件中
现在是图像数据
流数据以1字节块大小开始,然后进入位流。最后是另一个区块大小。当您绘制整个帧,然后在最后读取的块之后设置指针时,它停止
如果发现块大小为0,则表示帧数据结束。如果之后有终止符0x3b,则到达文件末尾
本地颜色位告诉您在开始时流中每个代码有多少位
我读取实际处理字节的LSB,然后将其右移,然后将代码右移,并将此位添加为其MSB。在达到所需的索引位计数后,通过LZW解压处理它,并向字典中添加新代码
如果字典跨越2^位边界,则增加代码位大小并继续。不要忘记处理清除和结束特殊代码
所以你有:066B408670482C1A
06h是初始位大小-1,所以实际位大小是7!!!
6bh是以字节为单位的块大小
40h是清晰的代码,表示color[]表中有64种颜色,第一个自由索引是66
86 70 48 2c 1a[hex]=| 1 00001110 | 01 110000 | 010 01000 | 0010 1100 | 00011 010 |[bin]
因此,代码是:
|00001110 | 110000 1 | 01000 01 | 1100 010 | 010 0010 |[bin]
|0000110 | 1100001 | 0100001 | 11000010 | 0100010 |[bin]
06,61,21,c2,22[十六进制]
数据中的61h建议错误这是图像数据的真正开始还是我在某个地方犯了错误?代码只能比字典中的最大索引大一个。除第一个代码外,字典每增加一个代码,因此在处理61h时,字典的大小仅为42h。尝试链接页面中的示例,它们可以工作…阅读本小节和所有小节,步骤示例中有您需要的所有内容,其余内容在规范文件中
现在是图像数据
流数据以1字节块大小开始,然后进入位流。最后是另一个区块大小。当您绘制整个帧,然后在最后读取的块之后设置指针时,它停止
如果发现块大小为0,则表示帧数据结束。如果之后有终止符0x3b,则到达文件末尾
本地颜色位告诉您在开始时流中每个代码有多少位
我读取实际处理字节的LSB,然后将其右移,然后将代码右移,并将此位添加为其MSB。在达到所需的索引位计数后,通过LZW解压处理它,并向字典中添加新代码
如果字典跨越2^位边界,则增加代码位大小并继续。不要忘记处理清除和结束特殊代码
所以你有:066B408670482C1A
06h是初始位大小-1,所以实际位大小是7!!!
6bh是以字节为单位的块大小
40h是清晰的代码,表示color[]表中有64种颜色,第一个自由索引是66
86 70 48 2c 1a[hex]=| 1 00001110 | 01 110000 | 010 01000 | 0010 1100 | 00011 010 |[bin]
因此,代码是:
|00001110 | 110000 1 | 01000 01 | 1100 010 | 010 0010 |[bin]
|0000110 | 1100001 | 0100001 | 11000010 | 0100010 |[bin]
06,61,21,c2,22[十六进制]
数据中的61h建议错误这是图像数据的真正开始还是我在某个地方犯了错误?代码只能比字典中的最大索引大一个。除第一个代码外,字典每增加一个代码,因此在处理61h时,字典的大小仅为42h。尝试链接页面中的示例,它们可以工作…您可能会研究一些现有代码。这是我当年使用的方法:解码表在已知状态下开始,并随着每个新代码的解码而更新,这与表在编码时的更新方式相同。这就是LZW的美丽之处。@Markransem谢谢你的链接!我发现很多解码示例都经过了优化,不容易阅读。多年前我在这个函数中发现了一个bug,不知道它是否在这个副本中被修复了。这是一个由一个或类似的关闭,它不经常弹出。你可以研究一些现有的代码。这是我当年使用的方法:解码表在已知状态下开始,并随着每个新代码的解码而更新,这与表在编码时的更新方式相同。这就是LZW的美丽之处。@Markransem谢谢你的链接!我有很多解码的例子
我发现它们太过优化,无法轻松阅读。多年前我在这个函数中发现了一个bug,不知道它是否在这个副本中被修复了。这是一个由一个或类似的东西关闭,它不经常弹出。