我试图解析GIF格式并且在读取图像数据时遇到一个问题。 该数据表示为位数组,包含可变长度值。
例如:
... 0010-1010-0010-0000-00111-10000-11111
有时代码的长度会增加,但我无法理解如何检测到这种增加。 我只有初始代码大小(第一个代码ex.4的长度)。
Standart只说:
附录F.可变长度代码LZW压缩。
...
算法的可变长度代码方面基于初始代码大小 (LZW初始代码大小),指定用于的初始位数 压缩码。当压缩机检测到的模式数量 在输入流中超过了当前可编码的模式数 位数,每个LZW代码的位数增加一个。
...
答案 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也可能有用。