2

我正在尝试从 GIF87a 光栅数据流中解码数据字节。我不确定如何读取 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 -> 清除代码 (2^6),即十进制 64 或十六进制 40
  • 86 -> 实际数据的开始

GIF87a 规范:http ://www.w3.org/Graphics/GIF/spec-gif87.txt

栅格流应该具有指向全局地图(或 LZW 树中的父级)的索引......但我不确定如何阅读它。

有人可以转换前几个字节(从 86 开始)作为示例吗?

4

1 回答 1

0

阅读这个3MF 项目 GIF和所有小节,您需要的所有内容都包含步进示例,其余的都在规范文件中。

现在是图像数据

流数据以 1 字节块大小开始,然后进入比特流。最后是另一个块大小。当您绘制整个帧然后在最后读取的块之后设置指针时它会停止。

如果您找到块大小0,则表示帧数据结束。如果之后有终止符0x3b,则到达文件末尾。

本地颜色位告诉您在开始时流中每个代码有多少位。

我读取了实际处理的 BYTE 的 LSB,然后将其右移,然后将代码右移并将该位添加为它的 MSB。在达到所需的索引位数后,通过 LZW 解压缩并将新代码添加到字典中。

如果字典越过 2^bits 边界,则增加代码位大小并继续。不要忘记处理清除和结束特殊代码......

所以你有了: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大小。尝试他们工作的链接页面中的示例...

于 2015-04-28T15:57:00.917 回答