JPEG文件中默认Huffman表说明
2014-06-03 22:47
691 查看
一、简述
关于JPEG中Huffman的说明,具体可参见《ISO/IEC10918-1, 1993(e), Annex C》。
在JPEG文件中,其数据包含有Huffman表数据,但这里面的Huffman表并不能直接应用于解码,还需要进行一些转换,以生成可以直接应用于解码的表。本文,即是说明如何进行转换。
二、Huffman表数据
在JPEG文件中,一般存在亮度与色度的Huffman表,亮度Huffman又存在DC(直流)表与AC(交流)表,色度也存在DC(直流)表与AC(交流)表,所以,在JPEG文件中,一般来说有4张Huffman表。这里,我们不再详述Huffman表在JPEG中的位置,可以去查找JPEG的文件格式相关文章,我们将直接从JPEG文件默认的Huffman表数据开始。
亮度DC的Huffman表数据,见图1画红线部分:
图1 亮度DC的Huffman表数据
亮度AC的Huffman表数据,见图2画红线部分:
图2亮度AC的Huffman表数据
色度表将不再进行表述,可以参考JPEG文件格式得到。
三、亮度Huffman表解析
解压时,需要用到Huffman_size、Huffman_code两张表,至于是如何使用这两张表进行Huffman解码的,请参见《JPEG中Huffman解码详解》。本节的目的,仅仅是说明如何利用第二节所说的Huffman表数据,得到Huffman_size、Huffman_code这两张表。
a) 什么是Huffman_size、Huffman_code表?
Huffman_size表中的数据代表着Huffman编码的长度;Huffman_code代表的是Huffman编码的内容。
例:Huffman_size= 3 , Huffman_code =2 ,则其对应的Huffman编码为010(即值等于2的3 bit宽度的数据)。
b) JPEG中的Huffman表数据的具体意义?
JPEG中的Huffman表数据包含两个部分,一个部分表示不同位宽的编码个数,一个部分表示编码的具体内容,根据这些内容,即可得到上在所述的Huffman_size、Huffman_code表。
我们以图1中的数据为例:前16个字节的数据为第1部分(BITS),00 01 05 0101 01 01 01 01 00 00 00 00 00 00 ,从第一个字节算起,共16个字节,这1~16个数据分别对应位宽1~16位的编码个数,从上可知:编码位宽为1的编码个数为0个,位宽为2的有1个,位宽为3的有5个等等。
接下来为第二部分(HUFFVAL),此部分用于产生一张表Huffman_table,使得这张表按照1~16的长度去对应于Huffman_size、Huffman_code表。
c) 如何转化的?
在《ISO/IEC10918-1, 1993(e), Annex C》中,用三个流程图,进行了详细的阐述,这里不再描述,仅将其相应的Matlab代码附上,以供参考:
d) 以图1亮度DC的Huffman表数据为例,执行上述操作后,ehufco、ehufsi分别为:
ehufco = 0 2 3 4 5 6 14 30 62 126 254 510
ehufsi = 2 3 3 3 3 3 4 5 6 7 8 9
对应的Huffman_table可以被描述成:
{ 2, 0x0000}, /* 00 */
{ 3, 0x0002},/* 010 */
{ 3,0x0003}, /* 011 */
{ 3,0x0004}, /* 100 */
{ 3,0x0005}, /* 101 */
{ 3,0x0006}, /* 110 */
{ 4,0x000e}, /* 1110 */
{ 5,0x001e}, /* 11110 */
{ 6,0x003e}, /* 111110 */
{ 7,0x007e}, /* 1111110 */
{ 8,0x00fe}, /* 11111110 */
{ 9, 0x01fe} /* 111111110*/
关于JPEG中Huffman的说明,具体可参见《ISO/IEC10918-1, 1993(e), Annex C》。
在JPEG文件中,其数据包含有Huffman表数据,但这里面的Huffman表并不能直接应用于解码,还需要进行一些转换,以生成可以直接应用于解码的表。本文,即是说明如何进行转换。
二、Huffman表数据
在JPEG文件中,一般存在亮度与色度的Huffman表,亮度Huffman又存在DC(直流)表与AC(交流)表,色度也存在DC(直流)表与AC(交流)表,所以,在JPEG文件中,一般来说有4张Huffman表。这里,我们不再详述Huffman表在JPEG中的位置,可以去查找JPEG的文件格式相关文章,我们将直接从JPEG文件默认的Huffman表数据开始。
亮度DC的Huffman表数据,见图1画红线部分:
图1 亮度DC的Huffman表数据
亮度AC的Huffman表数据,见图2画红线部分:
图2亮度AC的Huffman表数据
色度表将不再进行表述,可以参考JPEG文件格式得到。
三、亮度Huffman表解析
解压时,需要用到Huffman_size、Huffman_code两张表,至于是如何使用这两张表进行Huffman解码的,请参见《JPEG中Huffman解码详解》。本节的目的,仅仅是说明如何利用第二节所说的Huffman表数据,得到Huffman_size、Huffman_code这两张表。
a) 什么是Huffman_size、Huffman_code表?
Huffman_size表中的数据代表着Huffman编码的长度;Huffman_code代表的是Huffman编码的内容。
例:Huffman_size= 3 , Huffman_code =2 ,则其对应的Huffman编码为010(即值等于2的3 bit宽度的数据)。
b) JPEG中的Huffman表数据的具体意义?
JPEG中的Huffman表数据包含两个部分,一个部分表示不同位宽的编码个数,一个部分表示编码的具体内容,根据这些内容,即可得到上在所述的Huffman_size、Huffman_code表。
我们以图1中的数据为例:前16个字节的数据为第1部分(BITS),00 01 05 0101 01 01 01 01 00 00 00 00 00 00 ,从第一个字节算起,共16个字节,这1~16个数据分别对应位宽1~16位的编码个数,从上可知:编码位宽为1的编码个数为0个,位宽为2的有1个,位宽为3的有5个等等。
接下来为第二部分(HUFFVAL),此部分用于产生一张表Huffman_table,使得这张表按照1~16的长度去对应于Huffman_size、Huffman_code表。
c) 如何转化的?
在《ISO/IEC10918-1, 1993(e), Annex C》中,用三个流程图,进行了详细的阐述,这里不再描述,仅将其相应的Matlab代码附上,以供参考:
% 根据DHT产生HUFFSIZE[]、HUFFCODE[] % 参考"ISO/IEC10918-1, 1993(e), Annex C" % dxq@2014-04-24 function[ehufco,ehufsi]=dedht(dht) bits =dht(1:16); huffval =dht(17:end); % 参考"ISO/IEC10918-1, 1993(e), Annex C ,Figure C.1" k = 0 ; j = 1 ; fori=1:16 for j=1:bits(i) huffsize(k+1)=i; k=k+1; end end huffsize(k+1)=0; lastk = k; % 参考"ISO/IEC10918-1, 1993(e), Annex C ,Figure C.2" code = 0; k=1; si =huffsize(1); whilehuffsize(k)>0 huffcode(k)=code ; code = code + 1 ; k = k+ 1 ; while huffsize(k)==si huffcode(k)=code ; code = code + 1 ; k = k+ 1 ; end if huffsize(k)==0 break; end code = code * 2 ; si = si + 1; while huffsize(k)~= si code = code * 2 ; si = si + 1; end end % 参考"ISO/IEC10918-1, 1993(e), Annex C ,Figure C.3" for k=1:lastk i=huffval(k); ehufco(i+1)=uint32(huffcode(k)); ehufsi(i+1)=uint32(huffsize(k)); end
d) 以图1亮度DC的Huffman表数据为例,执行上述操作后,ehufco、ehufsi分别为:
ehufco = 0 2 3 4 5 6 14 30 62 126 254 510
ehufsi = 2 3 3 3 3 3 4 5 6 7 8 9
对应的Huffman_table可以被描述成:
{ 2, 0x0000}, /* 00 */
{ 3, 0x0002},/* 010 */
{ 3,0x0003}, /* 011 */
{ 3,0x0004}, /* 100 */
{ 3,0x0005}, /* 101 */
{ 3,0x0006}, /* 110 */
{ 4,0x000e}, /* 1110 */
{ 5,0x001e}, /* 11110 */
{ 6,0x003e}, /* 111110 */
{ 7,0x007e}, /* 1111110 */
{ 8,0x00fe}, /* 11111110 */
{ 9, 0x01fe} /* 111111110*/
相关文章推荐
- vsftp的默认配置文件说明
- MFC之头文件相互包含问题及解决方法 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
- MyEclipse设置JSP页面默认编码方式以及设置在Java文件中作者、日期等说明
- wordpress 中默认主题模板文件的说明
- hadoop默认3个核心配置文件说明
- MyEclipse设置JSP页面默认编码方式以及设置在Java文件中作者、日期等操作说明
- 两个类头文件相互包含出现的问题 : 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
- zblog文件缓存默认可用调用标签说明
- MyEclipse设置JSP页面默认编码方式以及设置在Java文件中作者、日期等说明
- Discuz x 默认模板文件目录说明
- MyEclipse设置JSP页面默认编码方式以及设置在Java文件中作者、日期等说明
- discuz 默认模板文件说明
- 设置JSP页面默认编码方式以及设置在Java文件中作者、日期等说明
- 设置JSP页面默认编码方式以及设置在Java文件中作者、日期等说明
- SYD8801批量烧录说明【缩写词解析】【烧录原理】【硬件支持】【工具】【第一部分:提取文件】【第二部分:制作批量烧录工具】【保存当前设置为默认设置】【 预计烧录时间】【带24KFLASH数据的批量】
- 关于 拷优(CopyU!)文件拷贝默认存放位置 的说明
- 。INF文件格式说明
- Asp.Net Forums 2.0.1 内部开发版系统文件说明
- VC项目文件说明(转载)
- DELPHI存取JPEG文件到SQL Server数据库(续文)