【问题标题】:Decoding a JPEG Huffman block (table)解码 JPEG Huffman 块(表)
【发布时间】:2010-12-06 12:56:51
【问题描述】:

以下块由霍夫曼块标记嵌套

-HUFF---------------------------------------------------------------------0084-
  10    0    1    2    4    3    4    6    5    6    8    a    9    4    2    3
   0    1    2   11    0    3    4   21    5   12   31    6   41   51   61   13
  22   71   81   91   a1   14   32   b1   d1   f0   15   23   35   42   b2   c1
   7   16   24   33   52   72   73   e1   25   34   43   53   62   74   82   94
  a2   f1   26   44   54   63   64   92   93   c2   d2   55   56   84   b3   45
  83   46   a3   e2
-------------------------------------------------------------------------------

0084是表格的长度,为整数,此处不包含在块中

根据 JPEG 标准,第一个地址显然使其成为目标 0 (0x10) 处的 AC 表

显然从那里开始它是一张霍夫曼表。

那么,它是如何解码的呢?

【问题讨论】:

  • “0084 是表格的整数长度” - 您的意思是十进制整数(以 10 为基数)。所有这些数字都是整数。长度最初是 0x0054 - 一个十六进制整数 - 您为我们将其转换为十进制。
  • 我的笔记应该很明显的是,这是使用stdio.hprintf函数中的格式说明符打印的,该函数包含%04i,它是带前导零的有符号整数的说明符和至少四个数字。
  • 我同意,如果人们习惯于将整数的概念等同于整数小数的概念,那一定是显而易见的。在字节海的上下文中,表示以十六进制编写的(整数)数字,并且在实际 DHT 将具有相同长度的位置,它本身表示为与其余数据格式相同的两个字节,它不太明显。
  • (在 DHT 中,表格的长度是表格数据之前的两个字节。)

标签: c compression jpeg huffman-code


【解决方案1】:

0x10 之后的 16 个字节告诉你每个长度有多少个代码。在您的示例中,有 0 个长度为 1 位的代码,1 个长度为 2 位的代码,2 个长度为 3 位的代码,4 个长度为 4 位的代码,3 个长度为 5 位的代码,依此类推。

这些值之后是由这些代码按顺序编码的值。再次从您的示例中:

Code length | Number | Symbol(s)
------------+--------+----------
1 bit       | 0      |
2 bits      | 1      | 0x01
3 bits      | 2      | 0x02 0x11
4 bits      | 4      | 0x00 0x03 0x04 0x21
5 bits      | 3      | 0x05 0x12 0x31
... etc

然后,您从上到下构建二叉树,按顺序分配符号。在这个例子中,你得到:

Symbol | Code 
-------+------
0x01   | 00
0x02   | 010
0x11   | 011
0x00   | 1000
0x03   | 1001
0x04   | 1010
0x21   | 1011
...etc

【讨论】:

  • 非常感谢,这对我的理解有很大帮助:)
  • 编辑:重读答案,它是第一个长度的代码,然后是代码字! (总是16个码字?),那我就知道我的问题的答案了! Thx - 原始评论:您如何从符号数量到实际符号。我怎么知道一个 2 位符号是 0x01,而不是 0x00、0x10 或 0x11? ...
猜你喜欢
  • 2019-04-12
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
相关资源
最近更新 更多