【发布时间】:2020-10-11 06:54:46
【问题描述】:
我正在关注 Daniel Harding 的 youtube 播放列表“您需要了解的有关 JPEG 的一切”,以了解如何定义 JPEG 文件格式。
在解码过程中,代码如下所示:
length = getNextSymbol()
...
coefficient = readBits(length)
mcu[0] = coefficient
getNextSymbol 函数的作用是这样的:
currentCode = 0;
for i < 16:
currentCode = (currentCode << 1) | readNextBit()
for each huffman_code with length i:
if currentCode == huffman_code:
return huffman_symbols[huffman_code]
完整的代码托管在 github 上: https://github.com/dannye/jed/blob/master/src/decoder.cpp
所以我们首先得到了应该是我们想要解析的值的符号。但在那之后,我们读取了这个符号的长度。 霍夫曼表是否只存储要读取的位数而不是“真实”值。 但在 AC 解码中,我们将符号直接存储到我们的 mcu 值中!
我的理解:
- 霍夫曼码 = 位序列或符号路径
- 霍夫曼符号 = 我们要使用此代码编码的值
问题: 为什么我们要读取符号,然后将符号转换为长度,读取这个长度并存储我们读取的值。但在 AC 中,我们存储符号而不读取位。
我在这里缺少什么? 感谢您的帮助,对我来说真的很难理解!
【问题讨论】:
-
可能系数太随机而无法从霍夫曼编码中受益,因此存储一个霍夫曼编码长度后跟一个值会更有效(大多数系数都是小值)
-
我认为这里的实际问题是您试图从视频中理解 JPEG 文件格式。我推荐一本关于这个主题的书。 JPEG 包含运行长度编码。也许
lengrh用于此步骤。 -
我找到了解决方案!我没有看到下一行,ac 确实是以相同的方式编写的。只存储值的长度对我来说仍然很奇怪。 @ThomasSablik 我正在阅读“压缩图像文件格式:JPEG、PNG、GIF、XBM、BMP”一书。
标签: c++ jpeg decoding huffman-code