1

我试图解析 GIF 格式并且在读取图像数据时遇到了一个问题。该数据表示为位数组,包含可变长度值。

前任:

0010-1010-0010-0000-00111-10000-11111...

有时代码的长度会增加,但我不明白如何检测到这种增加。我只有初始代码大小(第一个代码的长度,例如 4)。

标准只说:

附录 F. 可变长度代码 LZW 压缩。

...

该算法的可变长度代码方面基于初始代码大小(LZW-初始代码大小),它指定用于压缩代码的初始位数。当压缩器在输入流中检测到的模式数超过可用当前位数编码的模式数时,每个 LZW 码的位数增加 1。

...

4

2 回答 2

2

解析 GIF 文件时,图像描述符包括未编码符号的位宽(例如:8 位)。您可能已经知道,压缩数据的初始代码大小比未编码符号的位宽宽一位(例如:9 位)。

此外,您可能已经知道,GIF 文件中可能的压缩代码值会逐渐增大,最大为 0xFFF == 4095,需要 12 位来存储。

对于解压缩器从压缩数据中提取的每个代码,解压缩器都会在其字典中添加一个新项目。例如,如果解压缩器读取的前两个 9 位代码是 0x028 0x0FF,则解压缩器会在其字典中添加一个两字节序列。稍后,如果解压缩器曾经读取代码 0x102,则解压缩器将该 0x102 代码解码为两个 8 位字节 0x28 0xFF。

解压缩器添加到字典中的下一项被分配代码 0x103。

解压缩器添加到字典中的下一项被分配代码 0x104。...

最终,解压缩器将一个项目添加到分配代码 0x1FF 的字典中。这是适合 9 位的最大数字。将该项目存储到字典后,解压缩器开始读取 10 位代码。

解压缩器添加到字典中的下一项被分配代码 0x200。

数据序列中没有任何特殊的“命令”告诉解压缩器增加代码宽度。解压缩器必须跟踪字典到目前为止包含多少项(这通常可以方便地重新用作将下一项写入字典的位置的索引)。当解压缩器将项目 0x1ff 添加到字典中时,解压缩器就该开始读取 10 位代码了。当解压器将项目 0x3ff 添加到字典中时,解压器就该开始读取 11 位代码了。

于 2011-05-30T05:37:31.877 回答
1

先看这个例子,理解LZW可能比看标准更清楚。这可能有用。

于 2011-05-03T23:36:20.340 回答