GIF格式 - 单独的可变长度代码

时间:2011-05-03 23:33:09

标签: gif compression variable-length

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

例如:

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

有时代码的长度会增加,但我无法理解如何检测到这种增加。 我只有初始代码大小(第一个代码ex.4的长度)。

Standart只说:

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

...

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

...

2 个答案:

答案 0 :(得分: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位代码。

答案 1 :(得分:1)

首先看this example,了解LZW比看标准更清楚。 this也可能有用。