【问题标题】:How to detect codeword length for LZW Decoding如何检测 LZW 解码的码字长度
【发布时间】:2016-03-02 18:54:51
【问题描述】:

我正在编写一个通用的 LZW 解码器 c++ 程序,但我无法找到有关所用代码字长度(以位为单位)的文档。我发现的一些文章说码字的长度是 12 位,而另一些文章说是 16 位,而还有一些文章说使用了可变位长。那么它是哪一个?对我来说,位长是可变的是有道理的,因为这会提供最好的压缩(即最初从 9 位开始,然后在必要时移动到 10,然后移动到 11 等等......)。但我找不到任何关于行业标准的“官方”文档。

例如,如果我要打开 Microsoft Paint 并创建一个简单的 100x100 像素全黑图像并将其保存为 Tiff。图像使用 LZW 压缩保存在 Tiff 中。所以在这种情况下,当我解析 LZW 码字时,我应该为第一个码字读取 9 位、12 位还是 16 位?我怎么知道要使用哪个?

感谢您提供的任何帮助。

【问题讨论】:

  • LZW 本身只是一种算法,您不会找到特定参数的行业标准。为此,您需要深入研究每个应用程序,在您的示例中为 TIFF 规范。
  • 感谢 Mark 让我搜索 LZW 的 Tiff 实现。我只是认为这是一个通用算法......原来他们在字典中有一些保留条目(例如 Clear 和 EndOfInformation)以及我错了的位顺序信息。

标签: c++ decode lzw


【解决方案1】:

LZW 可以通过这些方式中的任何一种来完成。到目前为止,最常见的(至少在我的经验中)是从 9 位代码开始,然后当字典填满时,移动到 10 位代码,依此类推,直到某个最大大小。

从那里,您通常有几个选择。一种是清除字典并重新开始。另一个是继续使用当前字典,而不添加新条目。在后一种情况下,您通常会跟踪压缩率,如果它下降得太远,则清除字典并重新开始。

我必须仔细研究文档才能确定,但​​如果我没记错的话,TIFF 中使用的 LZW 的具体实现从 9 位开始,最高可达 12 位(在设计时,MS-DOS是一个主要目标,而 12 位代码的字典使用了大部分可用的 640K RAM)。如果有记忆,它会在使用最后一个 12 位代码后立即清除表。

【讨论】:

  • 谢谢杰瑞,所以问题是哪个码字长度对我的例子是正确的?在全黑图像(第一个像素是 RGB 0,0,0)的情况下,我希望第一个代码字(如果 9 位)包含全零,但在我的情况下,它是 000000010,其计算结果为 128 ,这不是我所期望的。
  • @Stanton:您需要阅读 TIFF 规范以了解详细信息。我很确定它从 9 位开始,但是用 7 位或 8 位值预先填充字典是很常规的。一个公平的数字也从发送一个“清晰的字典”代码开始(如果没记错的话,TIFF 会这样做),在这种情况下,第一个单词通常不会携带任何实际数据。
  • 感谢您的信息。我在martinreddy.net/gfx/2d/TIFF-5.txt 的附录 F 中找到了 Tiff 规范。他们使用 9 位代码开始(如您所建议的),Clear 和 EndOfInfo 有两个保留代码。另外,我的位顺序错误。所以我应该得到 256 作为第一个代码,它的计算结果是他们的 Clear 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
相关资源
最近更新 更多