【问题标题】:Why is "no code allowed to be all ones" in libjpeg's Huffman decoding?为什么libjpeg的霍夫曼解码中“不允许所有代码为全”?
【发布时间】:2015-10-03 01:17:58
【问题描述】:

我试图让自己满意,我从他们的 FTP 服务器获取的 METEOSAT 图像实际上是有效的图像。我的疑问出现了,因为到目前为止我使用的所有工具都抱怨“Bogus Huffman 表定义” - 但是当我简单地注释掉该错误消息时,图像看起来很合理(地球圆盘的灰度部分)。

来自https://github.com/libjpeg-turbo/libjpeg-turbo/blob/jpeg-8d/jdhuff.c#L379

while (huffsize[p]) {
  while (((int) huffsize[p]) == si) {
    huffcode[p++] = code;
    code++;
  }
  /* code is now 1 more than the last code used for codelength si; but
   * it must still fit in si bits, since no code is allowed to be all ones.
   */
  if (((INT32) code) >= (((INT32) 1) << si))
    ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
  code <<= 1;
  si++;
}

如果我只是简单地注释掉检查,或者添加一个检查 huffsize[p] 是否为非零(如在包含循环的控制表达式中),那么 djpeg 设法将图像转换为 BMP,我可以用很少的问题。

为什么评论声称不允许使用全一代码?

【问题讨论】:

    标签: huffman-code libjpeg libjpeg-turbo


    【解决方案1】:

    它声称这是因为它们是不允许的。这并不意味着不能有不符合标准的图像。

    他们不被允许的原因是这个(来自标准):

    将熵编码段制作成整数字节 如下:对于霍夫曼编码,如果需要,使用 1 位来填充 完成压缩数据的最后一个字节 段。

    如果允许使用全 1 的代码,那么您最终可能会在压缩数据的最后一个字节中出现歧义,其中填充的 1 可能是另一个编码符号。

    【讨论】:

    • 哇,谢谢你,我什至没有真正期待答案会出现,更不用说一个线程杀死一个!现在我只需要告诉一家航天机构他们的图像很糟糕。
    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多