【问题标题】:GIF format - separate variable-length codesGIF 格式 - 单独的可变长度代码
【发布时间】:2011-08-18 03:04:39
【问题描述】:

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

例如:

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

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

标准只说:

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

...

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

...

【问题讨论】:

    标签: gif compression variable-length


    【解决方案1】:

    解析 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 位代码。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我阅读了标准并在我的问题中引用它,但我仍然无法理解这一点。我不需要了解LZW算法(你的第一个链接),我只是对这个GIF文件格式的变长代码有疑问,请给我解释一下
      • 我认为您必须阅读有关Huffman coding 的内容,有一种方法可以使用这种编码来唯一地区分可变长度的代码块而没有边界。电话前缀和号码中使用了类似的东西,看看我的链接并尝试了解它是如何工作的。
      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 2016-08-26
      • 2016-11-09
      • 1970-01-01
      相关资源
      最近更新 更多