《JPEG编码解码流程.docx》由会员分享,可在线阅读,更多相关《JPEG编码解码流程.docx(21页珍藏版)》请在三一办公上搜索。
1、JPEG图片压缩算法流程详解薛晓利JPEG是Joint Photographic Exports Group的英文缩写,中文称之为联合图像专家小组。 该小组隶属于ISO国际标准化组织,主要负责定制静态数字图像的编码方法,即所谓的JPEG 算法。JPEG专家组开发了两种基本的压缩算法、两种熵编码方法、四种编码模式。如下所 示:压缩算法:(1)有损的离散余弦变换 DCT( Discrete Cosine Transform)(2)无损的预测压缩技术;熵编码方法:(1)Huffman 编码;(2)算术编码;编码模式:(1)基于DCT的顺序模式:编码、解码通过一次扫描完成;(2)基于DCT的渐进模式:
2、编码、解码需要多次扫描完成,扫描效果由粗到精,逐级 递增;(3)无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;(4)层次模式:图像在多个空间分辨率中进行编码,可以根据需要只对低分辨率数据 做解码,放弃高分辨率信息;在实际应用中,JPEG图像编码算法使用的大多是离散余弦变换、Huffman编码、顺序 编码模式。这样的方式,被人们称为JPEG的基本系统。这里介绍的JPEG编码算法的流程, 也是针对基本系统而言。基本系统的JPEG压缩编码算法一共分为11个步骤:颜色模式转换、采样、分块、离 散余弦变换(DCT)、Zigzag扫描排序、量化、DC系数的差分脉冲调制编码、DC系数的 中间
3、格式计算、AC系数的游程长度编码、AC系数的中间格式计算、熵编码。下面,将一 一介绍这11个步骤的详细原理和计算过程。(1)颜色模式转换JPEG采用的是YCrCb颜色空间,而BMP采用的是RGB颜色空间,要想对BMP图片 进行压缩,首先需要进行颜色空间的转换。YCrCb颜色空间中,Y代表亮度,Cr,Cb则代表 色度和饱和度(也有人将Cb,Cr两者统称为色度),三者通常以Y,U,V来表示,即用U代表 Cb,用V代表Cr。RGB和YCrCb之间的转换关系如下所示:Y = 0.299R+0.587G+0.114BCb = -0.1687R-0.3313G+0.5B+128Cr = 0.5R=0.41
4、8G-0.0813B+128一般来说,C值(包括Cb Cr)应该是一个有符号的数字,但这里通过加上128,使其变为8 位的无符号整数,从而方便数据的存储和计算。R = Y+1.402(Cr-128)G = Y-0.34414(Cb-128)-0.71414(Cr-128)B = Y+1.772(Cb-128)(2)采样研究发现,人眼对亮度变换的敏感度要比对色彩变换的敏感度高出很多。因此,我们可以认为Y分量要比Cb,Cr分量重要的多。在BMP图片中,RGB三个分量各采用一个字节 进行采样,也就是我们常听到的RGB888的模式;而JPEG图片中,通常采用两种采样方式: YUV411 和 YUV42
5、2,它们所代表的意义是Y,Cb,Cr三个分量的数据取样比例一般是4: 1: 1或者4: 2: 2(4: 1: 1含义就是:在2x2的单元中,本应分别有4个Y,4个U,4个V 值,用12个字节进行存储。经过4:1:1采样处理后,每个单元中的值分别有4个Y、1个U、 1个V,只要用6个字节就可以存储了)。这样的采样方式,虽然损失了一定的精度但也在 人眼不太察觉到的范围内减小了数据的存储量。当然,JPEG格式里面也允许将每个点的U,V 值都记录下来;(3)分块由于后面的DCT变换是是对8x8的子块进行处理的,因此,在进行DCT变换之前必须 把源图象数据进行分块。源图象中每点的3个分量是交替出现的,先
6、要把这3个分量分开, 存放到3张表中去。然后由左及右,由上到下依次读取8x8的子块,存放在长度为64的表 中,即可以进行DCT变换。注意,编码时,程序从源数据中读取一个8x8的数据块后,进 行DCT变换,量化,编码,然后再读取、处理下一个8*8的数据块。JPEG编码是以每8x8个点为一个单位进行处理的.所以如果原始图片的长宽不是8 的倍数,都需要先补成8的倍数,使其可以进行一块块的处理。将原始图像数据分为8*8的 数据单元矩阵之后,还必须将每个数值减去128,然后一一带入DCT变换公式,即可达到 DCT变换的目的。图像的数据值必须减去128,是因为DCT公式所接受的数字范围是-128 到127
7、之间。(4)离散余弦变换DCT(Discrete Cosine Transform,离散余弦变换),是码率压缩中常用的一种变换编码方法。任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换 一样具有明确的物理意义。DCT是先将整体图像分成N*N的像素块,然后针对N*N的像 素块逐一进行DCT操作。需要提醒的是,JPEG的编码过程需要进行正向离散余弦变换,而 解码过程则需要反向离散余弦变换。正向离散余弦变换计算公式:仇皿,)=F(乩以s(7(时=*,当由=0(2x + r2NC052 AT(7(时=1当山=*T反向离散余弦变换计算公式:27 7V)= 。但)。同 Z f(x
8、.y)cos(2x+ 1)尊女_ 2N _L:LlS(初 + l)wr_ 2N _这里的N是水平、垂直方向的像素数目,一般取值为8。8*8的二维像素块经过DCT操 作之后,就得到了 8*8的变换系数矩阵。这些系数,都有具体的物理含义,例如,U=0,V=0时的F(0,0)是原来的64个数据的均值,相当于直流分量,也有人称之为DC系数或者直 流系数。随着U,V的增加,相另外的63个系数则代表了水平空间频率和垂直空间频率分量 (高频分量)的大小,多半是一些接近于0的正负浮点数,我们称之为交流系数AC。DCT 变换后的8*8的系数矩阵中,低频分量集中在矩阵的左上角。高频成分则集中在右下角。这里,我们暂
9、时先只考虑水平方向上一行数据(8个像素)的情况时的DCT变换,从而 来说明其物理意义。如下图所示:原始的图像信号(最左边的波形)经过DCT变换之后变成了 8个波,其中第一个波为直 流成分,其余7个为交流成分。可见图像信号被分解为直流成分和一些从低频到高频的各种余弦成分。而DCT系数只表 示了该种成分所占原图像信号的份额大小。显然,恢复图像信息可以表示为下面的式子:F(n) = C(n)*E(n),这里,E(n)是一个基底,C(n)是DCT系数,F(n)则是图像信号;如 果考虑垂直方向的变化,那就需要一个二维的基底。大学里面的信号处理,傅里叶变换等课 程上也讲过,任何信号都可以被分解为基波和不同
10、幅度的谐波的组合,而DCT变换的物理意 义也正是如此。由于大多数图像的高频分量比较小,相应的图像高频分量的DCT系数经常接近于0, 再加上高频分量中只包含了图像的细微的细节变化信息,而人眼对这种高频成分的失真不太 敏感,所以,可以考虑将这一些高频成分予以抛弃,从而降低需要传输的数据量。这样一来, 传送DCT变换系数的所需要的编码长度要远远小于传送图像像素的编码长度。到达接收端 之后通过反离散余弦变换就可以得到原来的数据,虽然这么做存在一定的失真,但人眼是可 接受的,而且对这种微小的变换是不敏感的。(5)Zigzag扫描排序DCT将一个8x8的数组变换成另一个8x8的数组.但是内存里所有数据都是
11、线形存 放的,如果我们一行行的存放这64个数字,每行的结尾的点和下行开始的点就没有什么关 系,所以JPEG规定按如下图中的数字顺序依次保存和读取64个DCT的系数值。0156141527282471316262942381217253041439111824314044531019233239455254202233384651556021343747505659613536484957586263这样数列里的相邻点在图片上也是相邻的了。不难发现,这种数据的扫描、保存、读取方式,是从8*8矩阵的左上角开始,按照英文字母Z的形状进行扫描的,一般将其称之为如下图所示:Zigzag扫描排序。(6)量
12、化图像数据转换为DCT频率系数之后,还要进行量化阶段,才能进入编码过程。量化阶 段需要两个8*8量化矩阵数据,一个是专门处理亮度的频率系数,另一个则是针对色度的频 率系数,将频率系数除以量化矩阵的值之后取整,即完成了量化过程。当频率系数经过量化 之后,将频率系数由浮点数转变为整数,这才便于执行最后的编码。不难发现,经过量化阶 段之后,所有的数据只保留了整数近似值,也就再度损失了一些数据内容。在JPEG算法中, 由于对亮度和色度的精度要求不同,分别对亮度和色度采用不同的量化表。前者细量化,后 者粗量化。下图给出JPEG的亮度量化表和色度量化表,该量化表是从广泛的实验中得出的。当然, 你也可以自定
13、义量化表。16111016244051611212M1926586055141316244057695614172229518780621837566809103. 7724355564811041139249647887103121120101729295981121001039917182447I 9999999918212666999999992426569999_99_99_99_47669999999999999999_9999|_99_9999_999999- 99999999999999999999999999999999999999999999邛卫G色度量化表这两张表依据心理视
14、觉阀制作,对8bit的亮度和色度的图象的处理效果不错。量化表 是控制JPEG压缩比的关键,这个步骤除掉了一些高频量,损失了很多细节信息。但事实上 人眼对高频信号的敏感度远没有低频信号那么敏感。所以处理后的视觉损失很小,从上面的 量化表也可以看出,低频部分采用了相对较短的量化步长,而高频部分则采用了相对较长的 量化步长,这样做,也是为了在一定程度上得到相对清晰的图像和更高的压缩率。另一个重 要原因是所有的图片的点与点之间会有一个色彩过渡的过程,而大量的图象信息被包含在低 频率空间中,经过DCT处理后,在高频率部分,将出现大量连续的零。(7)DC系数的差分脉冲调制编码8*8的图像块经过DCT变换之
15、后得到的DC系数有两个特点:(1)系数的数值比较大;(2)相邻的8*8图像块的DC系数值变化不大;根据这两个特点,DC系数一般采用差分脉冲调制编码DPCM(Difference Pulse Code Modulation),即:取同一个图像分量中每个DC值与前一个DC值的差值diff DC -DC 来进行编码。对差值进行编码所需要的位数会比对原值进行编码所需要的位数少了很多。假 设某一个8*8图像块的DC系数值为15,而上一个8*8图像块的DC系数为12,则两者之 间的差值为3。(8)DC系数的中间格式计算JPEG中为了更进一步节约空间,并不直接保存数据的具体数值,而是将数据按照位数 分为16
16、组,保存在表里面。这也就是所谓的变长整数编码VLI。即,第0组中保存的编码 位数为0,其编码所代表的数字为0;第1组中保存的编码位数为1,编码所代表的数字为 -1或者1.,如下面的表格所示,这里,暂且称其为VLI编码表:4, 110. 1200, 01, 10, 11-7? -6t -5? -4? 4? 5 & 73ooo. aoii oio, oil loo, urn110, 111-15? ._5 -8? 8? . 9 154|顾,.,0111, IDOL 1111-3b -W 16, . 315ooooo, oniL ioooDt .mu-免一,-32, 32s., &36门27 z -
17、64,.+ 1271 45,,-1 弱,255851b,门5上 W56, ,5119-1023,-512, 512,10231D.-2017, , -1024, 1024, 一,如4711姬5, 一,-2048; 204&, 一,109512i-乱。1,也如,4闻一,&19113-1S38$-涵,819L1638314.-327酊,.,-1(53跑,16384,3276715.藏佰Q0实际保存值前面提到的那个DC差值为3的数据,通过查找VLI可以发现,整数3位于VLI表格的第2 组,因此,可以写成(2)(3)的形式,该形式,称之为DC系数的中间格式。(9) AC系数的行程长度编码(RLC)量化
18、之后的AC系数的特点是,63个系数中含有很多值为0的系数。因此,可以采用 行程编码RLC(Run Length Coding)来更进一步降低数据的传输量。利用该编码方式,可 以将一个字符串中重复出现的连续字符用两个字节来代替,其中,第一个字节代表重复的次 数,第二个字节代表被重复的字符串。例如,(4,6)就代表字符串“6666”。但是,在JPEG 编码中,RLC的含义就同其原有的意义略有不同。在JPEG编码中,假设RLC编码之后得 到了一个(M,N)的数据对,其中M是两个非零AC系数之间连续的0的个数(即,行程 长度),N是下一个非零的AC系数的值。采用这样的方式进行表示,是因为AC系数当中
19、有大量的0,而采用Zigzag扫描也会使得AC系数中有很多连续的0的存在,如此一来,便 非常适合于用RLC进行编码。例如,现有一个字符串,如下所示:57,45,0,0,0,0,23,0,-30,-8,0,0,1,000.经过RLC之后,将呈现出以下的形式:(0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-8) ; (2,1) ; (0,0)注意,如果AC系数之间连续0的个数超过16,则用一个扩展字节(15,0)来表示16连 续的0。(10) AC系数的中间格式根据前面提到的VLI表格,对于前面的字符串:(0,57) ; (0,45) ; (4,23) ; (1,
20、-30) ; (0,-8) ; (2,1) ; (0,0)只处理每对数右边的那个数据,对其进行VLI编码:查找上面的VLI编码表格,可以发 现,57在第6组当中,因此,可以将其写成(0,6),57的形式,该形式,称之为AC系数的中 间格式。同样的(0,45)的中间格式为:(0,6),45;(1,-30)的中间格式为:(1,5),-30;(11)熵编码在得到DC系数的中间格式和AC系数的中间格式之后,为进一步压缩图象数据,有必 要对两者进行熵编码。JPEG标准具体规定了两种熵编码方式:Huffman编码和算术编码。 JPEG基本系统规定采用Huffman编码(因为不存在专利问题),但JPEG标准
21、并没有限制 JPEG算法必须用Huffman编码方式或者算术编码方式。Huffman编码:对出现概率大的字符分配字符长度较短的二进制编码,对出现概率小的 字符分配字符长度较长的二进制编码,从而使得字符的平均编码长度最短。Huffman编码的 原理请参考数据结构中的Huffman树或者最优二叉树。Huffman编码时DC系数与AC系数分别采用不同的Huffman编码表,对于亮度和色度 也采用不同的Huffman编码表。因此,需要4张Huffman编码表才能完成熵编码的工作。 具体的Huffman编码采用查表的方式来高效地完成。然而,在JPEG标准中没有定义缺省的 Huffman表,用户可以根据实
22、际应用自由选择,也可以使用JPEG标准推荐的Huffman表。 或者预先定义一个通用的Huffman表,也可以针对一副特定的图像,在压缩编码前通过搜 集其统计特征来计算Huffman表的值。下面我们举例来说明8*8图像子块经过DCT及量化之后的处理过程:假设一个图像块经过量化以后得到以下的系数矩阵:15 0 -1 0 0 0 0 0-2 -1 0 0 0 0 0 0-1 -1 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0显然,DC系数为15,假设前一个8*8的图像块的
23、DC系数量化值为12,则当前DC系统 同上一个DC系数之间的差值为3,通过查找VLI编码表,可以得到DC系数的中间格式为(2)(3),这里的2代表后面的数字(3)的编码长度为2位;之后,通过Zigzag扫描之后, 遇到第一个非0的AC系数为-2,遇到0的个数为1,AC系数经过RLC编码后可表示为(1, -2),通过查找VLI表发现,-2在第2组,因此,该AC系数的中间格式为(1,2)-2;其余的点类似,可以求得这个8*8子块熵编码的中间格式为(DC) (2) (3); AC (1, 2) (-2), (0, 1) (-1), (0, 1) (-1), (0, 1) (-1), (2,1)(-1
24、),(EOB)(0,0)对于DC系数的中间格式(2)(3)而言,数字2查DC亮度Huffman表得到011,数字3通 过查找VLI编码表得到其被编码为11;对于AC系数的中间格式(1,2)(-2)而言,(1,2)查AC亮度Huffman表得到11011,-2 通过查找VLI编码表得到其被编码为01;对于AC系数的中间格式(0,1)(-1)而言,(0,1)查AC亮度Huffman表得到00,数字-1 通过查找VLI编码表得到其被编码为0;对于AC系数的中间格式(2,1)(1)而言,(2,1)查AC亮度Huffman表得到11100,数 字-1通过查找VLI编码表得到其被编码为0;对于AC系数的中
25、间格式(0,0)而言,查AC亮度Huffman表得到1010;因此,最后这个8*8子块亮度信息压缩后的数据流为01111,1101101,000,000,000, 111000,1010。总共31比特,其压缩比是64*8/31=16.5,大约每个像素用半个比特。JPEG推荐的DC和AC系数的huffman(哈夫曼)码表Table K.3 - Table for luminance DC coefficient differencesCategoryCode lengthCode word020001301023011331004310153110641110751111086111110971
26、11111010811111110119111111110Table K.4 - Table for chrominance DC coefficient differencesCategoryCode lengthCode word012000112012121031311041411105151111061611111071711111108181111111091911111111010101111111110111111111111110Table K.5 -Table for luminance AC coefficients(sheet 1 of 4)Run/SizeCode le
27、ngthCode word0/0 (EOB)1410100/112000/212010/3131000/41410110/515110100/61711110000/718111110000/81011111101100/91611111111100000100/A1611111111100000111/11411001/215110111/31711110011/4191111101101/511111111101101/61611111111100001001/71611111111100001011/81611111111100001101/91611111111100001111/A1
28、611111111100010002/115111002/218111110012/31011111101112/4121111111101002/51611111111100010012/61611111111100010102/71611111111100010112/81611111111100011002/91611111111100011012/A1611111111100011103/1161110103/2191111101113/3121111111101013/41611111111100011113/51611111111100100003/6161111111110010
29、0013/71611111111100100103/81611111111100100113/91611111111100101003/A161111111110010101Table K.5 (sheet 2 of 4)Run/SizeCode lengthCode word4/1161110114/21011111110004/31611111111100101104/41611111111100101114/51611111111100110004/61611111111100110014/71611111111100110104/81611111111100110114/9161111
30、1111100111004/A1611111111100111015/11711110105/211111111101115/31611111111100111105/41611111111100111115/51611111111101000005/61611111111101000015/71611111111101000105/81611111111101000115/91611111111101001005/A1611111111101001016/11711110116/2121111111101106/31611111111101001106/4161111111110100111
31、6/51611111111101010006/61611111111101010016/71611111111101010106/81611111111101010116/91611111111101011006/A1611111111101011017/118111110107/2121111111101117/31611111111101011107/41611111111101011117/51611111111101100007/61611111111101100017/71611111111101100107/81611111111101100117/9161111111110110
32、1007/A1611111111101101018/1191111110008/215111111111000000Run/SizeCode lengthCode word8/31611111111101101108/41611111111101101118/51611111111101110008/61611111111101110018/71611111111101110108/81611111111101110118/91611111111101111008/A1611111111101111019/1191111110019/21611111111101111109/316111111
33、11101111119/41611111111110000009/51611111111110000019/61611111111110000109/71611111111110000119/81611111111110001009/91611111111110001019/A161111111111000110A/119111111010A/2161111111111000111A/3161111111111001000A/4161111111111001001A/5161111111111001010A/6161111111111001011A/7161111111111001100A/8
34、161111111111001101A/9161111111111001110A/A161111111111001111B/1101111111001B/2161111111111010000B/3161111111111010001B/4161111111111010010B/5161111111111010011B/6161111111111010100B/7161111111111010101B/8161111111111010110B/9161111111111010111B/A161111111111011000C/1101111111010C/2161111111111011001
35、C/3161111111111011010C/4161111111111011011Table K.5 (sheet 4 of 4)Run/SizeCode lengthCode wordC/5161111111111011100C/6161111111111011101C/7161111111111011110C/8161111111111011111C/9161111111111100000C/A161111111111100001D/11111111111000D/2161111111111100010D/3161111111111100011D/4161111111111100100D
36、/5161111111111100101D/6161111111111100110D/7161111111111100111D/8161111111111101000D/9161111111111101001D/A161111111111101010E/1161111111111101011E/2161111111111101100E/3161111111111101101E/4161111111111101110E/5161111111111101111E/6161111111111110000E/7161111111111110001E/8161111111111110010E/91611
37、11111111110011E/A161111111111110100F/0 (ZRL)1111111111001F/1161111111111110101F/2161111111111110110F/3161111111111110111F/4161111111111111000F/5161111111111111001F/6161111111111111010F/7161111111111111011F/8161111111111111100F/9161111111111111101F/A161111111111111110JPEG文件格式介绍:JPEG文件的存储格式有很多种,但最常用的是
38、JFIF格式,即JPEG File Interchange Formate JPEG文件大体可以分为两个部分:(1) 标记码;由两个字节构成,其中,前一个字节是固定值0XFF代表了一个标记码 的开始,后一个字节不同的值代表着不同的含义。需要提醒的是,连续的多个0XFF可以理 解为一个0XFF,并表示一个标记码的开始。另外,标记码在文件中一般是以标记代码的形 式出现的。例如,SOI的标记代码是0XFFD8,即,如果JPEG文件中出现了 0XFFD8,则代 表此处是一个SOI标记。(2) 压缩数据;一个完整的两字节标记码的后面,就是该标记码对应的压缩数据了, 它记录了关于文件的若干信息。一些典型的
39、标记码,及其所代表的含义如下所示:SOI,Start Of Image,图像开始,标记代码为固定值0XFFD8,用2字节表示;APP0,Application 0,应用程序保留标记0,标记代码为固定值0XFFE0,用2字节表示; 该标记码之后包含了 9个具体的字段:(1) 数据长度:2个字节,用来表示(1) - (9)的9个字段的总长度,即不包含标记代 码但包含本字段;(2) 标示符:5个字节,固定值0X4A6494600,表示了字符串“JFIF0”;(3) 版本号:2个字节,一般为0X0102,表示JFIF的版本号为1.2;但也可能为其它数值, 从而代表了其它版本号;(4) X,Y方向的密度
40、单位:1个字节,只有三个值可选,0:无单位;1:点数每英寸;2: 点数每厘米;(5) X方向像素密度:2个字节,取值范围未知;(6) Y方向像素密度:2个字节,取值范围未知;(7) 缩略图水平像素数目:1个字节,取值范围未知;(8) 缩略图垂直像素数目:1个字节,取值范围未知;(9) 缩略图RGB位图:长度可能是3的倍数,保存了一个24位的RGB位图;如果没有缩 略位图(这种情况更常见),则字段(7) (8)的取值均为0;APPn, Application n,应用程序保留标记 n(n=1-15),标记代码为2个字节,取值为 0XFFE1-0XFFFF ;包含了两个字段:(1) 数据长度,2个
41、字节,表示(1) (2)两个字段的总长度;即,不包含标记代码,但包 含本字段;(2) 详细信息:数据长度-2个字节,内容不定;DQT,Define Quantization Table,定义量化表;标记代码为固定值0XFFDB;包含9个具体 字段:(1) 数据长度:2个字节,表示(1)和多个(2)字段的总长度;即,不包含标记代码, 但包含本字段;(2) 量化表:数据长度-2个字节,其中包括以下内容:(a) 精度及量化表ID,1个字节,高4位表示精度,只有两个可选值,0: 8位;1:16 位;低4位表示量化表ID,取值范围为0-3;(b) 表项,64* (精度取值+1)个字节,例如,8位精度的量
42、化表,其表项长度为64* (0+1) =64 字节;本标记段中,(2)可以重复出现,表示多个量化表,但最多只能出现4次;SOFO, Start Of Frame,帧图像开始,标记代码为固定值0XFFC0;包含9个具体字段:(1)数据长度:2个字节,(1)-(6)共6个字段的总长度;即,不包含标记代码,但包 含本字段;(2)精度:1个字节,代表每个数据样本的位数;通常是8位;(3)图像高度:2个字节,表示以像素为单位的图像高度,如果不支持DNL就必须大于0;(4)图像宽度:2个字节,表示以像素为单位的图像宽度,如果不支持DNL就必须大于0;(5)颜色分量个数:1个字节,由于JPEG采用YCrCb
43、颜色空间,这里恒定为3;(6)颜色分量信息:颜色分量个数*3个字节,这里通常为9个字节;并依此表示如下一些 信息:(a)颜色分量ID: 1个字节;(b)水平/垂直采样因子:1个字节,高4位代表水平采样因子,低4位代表垂直采样 因子;(c)量化表:1个字节,当前分量使用的量化表ID;本标记段中,字段(6)应该重复出现3次,因为这里有3个颜色分量;DHT,Define Huffman Table 定义 Huffman 表,标记码为 0XFFC4;包含 2 个字段:(1)数据长度,2个字节,表示(1)-(2)的总长度,即,不包含标记代码,但包含本 字段;(2)Huffman表,数据长度-2个字节,包含以下字段:(a)表I