Image processing 对光栅数据流的数据字节进行解码

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树中父级的索引…但我不确定如何读取它 是否有

我正在尝试从光栅数据流中解码数据字节。我不确定如何读取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树中父级的索引…但我不确定如何读取它

是否有人可以转换从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,不知道它是否在这个副本中被修复了。这是一个由一个或类似的东西关闭,它不经常弹出。