JPEG编码解码流程_第1页
JPEG编码解码流程_第2页
JPEG编码解码流程_第3页
JPEG编码解码流程_第4页
JPEG编码解码流程_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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.418G

4、-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和YUV422

5、,它们所代表的意义是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个分量是交替出现的,先要把这3个分量分开,存

6、放到3张表中去。然后由左及右,由上到下依次读取8x8的子块,存放在长度为64的表中,即可以进行DCT变换。注意,编码时,程序从源数据中读取一个8x8的数据块后,进行DCT变换,量化,编码,然后再读取、处理下一个8*8的数据块。 JPEG 编码是以每8x8个点为一个单位进行处理的. 所以如果原始图片的长宽不是 8 的倍数, 都需要先补成8的倍数, 使其可以进行一块块的处理。将原始图像数据分为8*8的数据单元矩阵之后,还必须将每个数值减去128,然后一一带入DCT变换公式,即可达到DCT变换的目的。图像的数据值必须减去128,是因为DCT公式所接受的数字范围是-128到127之间。(4) 离散余弦

7、变换DCT(Discrete Cosine Transform,离散余弦变换),是码率压缩中常用的一种变换编码方法。任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换一样具有明确的物理意义。DCT是先将整体图像分成N*N的像素块,然后针对N*N的像素块逐一进行DCT操作。需要提醒的是,JPEG的编码过程需要进行正向离散余弦变换,而解码过程则需要反向离散余弦变换。正向离散余弦变换计算公式:反向离散余弦变换计算公式:这里的N是水平、垂直方向的像素数目,一般取值为8。8*8的二维像素块经过DCT操作之后,就得到了8*8的变换系数矩阵。这些系数,都有具体的物理含义,例如,U=0

8、,V=0时的F(0,0)是原来的64个数据的均值,相当于直流分量,也有人称之为DC系数或者直流系数。随着U,V的增加,相另外的63个系数则代表了水平空间频率和垂直空间频率分量(高频分量)的大小,多半是一些接近于0的正负浮点数,我们称之为交流系数AC。DCT变换后的8*8的系数矩阵中,低频分量集中在矩阵的左上角。高频成分则集中在右下角。这里,我们暂时先只考虑水平方向上一行数据(8个像素)的情况时的DCT变换,从而来说明其物理意义。如下图所示:原始的图像信号(最左边的波形)经过DCT变换之后变成了8个波,其中第一个波为直流成分,其余7个为交流成分。可见图像信号被分解为直流成分和一些从低频到高频的各

9、种余弦成分。而DCT系数只表示了该种成分所占原图像信号的份额大小。显然,恢复图像信息可以表示为下面的式子:F(n) = C(n)*E(n),这里,E(n)是一个基底,C(n)是DCT系数,F(n)则是图像信号;如果考虑垂直方向的变化,那就需要一个二维的基底。大学里面的信号处理,傅里叶变换等课程上也讲过,任何信号都可以被分解为基波和不同幅度的谐波的组合,而DCT变换的物理意义也正是如此。由于大多数图像的高频分量比较小,相应的图像高频分量的DCT系数经常接近于0,再加上高频分量中只包含了图像的细微的细节变化信息,而人眼对这种高频成分的失真不太敏感,所以,可以考虑将这一些高频成分予以抛弃,从而降低需

10、要传输的数据量。这样一来,传送DCT变换系数的所需要的编码长度要远远小于传送图像像素的编码长度。到达接收端之后通过反离散余弦变换就可以得到原来的数据,虽然这么做存在一定的失真,但人眼是可接受的,而且对这种微小的变换是不敏感的。(5) Zigzag扫描排序 DCT 将一个 8x8 的数组变换成另一个 8x8 的数组. 但是内存里所有数据都是线形存放的, 如果我们一行行的存放这 64 个数字, 每行的结尾的点和下行开始的点就没有什么关系, 所以 JPEG 规定按如下图中的数字顺序依次保存和读取64 个DCT的系数值。 这样数列里的相邻点在图片上也是相邻的了。不难发现,这种数据的扫描、保存、读取方式

11、,是从8*8矩阵的左上角开始,按照英文字母Z的形状进行扫描的,一般将其称之为Zigzag扫描排序。如下图所示: (6) 量化 图像数据转换为DCT频率系数之后,还要进行量化阶段,才能进入编码过程。量化阶段需要两个8*8量化矩阵数据,一个是专门处理亮度的频率系数,另一个则是针对色度的频率系数,将频率系数除以量化矩阵的值之后取整,即完成了量化过程。当频率系数经过量化之后,将频率系数由浮点数转变为整数,这才便于执行最后的编码。不难发现,经过量化阶段之后,所有的数据只保留了整数近似值,也就再度损失了一些数据内容。在JPEG算法中,由于对亮度和色度的精度要求不同,分别对亮度和色度采用不同的量化表。前者细

12、量化,后者粗量化。 下图给出JPEG的亮度量化表和色度量化表,该量化表是从广泛的实验中得出的。当然,你也可以自定义量化表。 这两张表依据心理视觉阀制作, 对 8bit 的亮度和色度的图象的处理效果不错。量化表是控制 JPEG 压缩比的关键,这个步骤除掉了一些高频量, 损失了很多细节信息。但事实上人眼对高频信号的敏感度远没有低频信号那么敏感。所以处理后的视觉损失很小,从上面的量化表也可以看出,低频部分采用了相对较短的量化步长,而高频部分则采用了相对较长的量化步长,这样做,也是为了在一定程度上得到相对清晰的图像和更高的压缩率。另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程,而大量的图

13、象信息被包含在低频率空间中,经过DCT处理后, 在高频率部分, 将出现大量连续的零。(7) DC系数的差分脉冲调制编码8*8的图像块经过DCT变换之后得到的DC系数有两个特点:(1) 系数的数值比较大;(2) 相邻的8*8图像块的DC系数值变化不大;根据这两个特点,DC系数一般采用差分脉冲调制编码DPCM(Difference Pulse Code Modulation),即:取同一个图像分量中每个DC值与前一个DC值的差值来进行编码。对差值进行编码所需要的位数会比对原值进行编码所需要的位数少了很多。假设某一个8*8图像块的DC系数值为15,而上一个8*8图像块的DC系数为12,则两者之间的差

14、值为3。(8) DC系数的中间格式计算 JPEG中为了更进一步节约空间,并不直接保存数据的具体数值,而是将数据按照位数分为16组,保存在表里面。这也就是所谓的变长整数编码VLI。即,第0组中保存的编码位数为0,其编码所代表的数字为0;第1组中保存的编码位数为1,编码所代表的数字为-1或者1.,如下面的表格所示,这里,暂且称其为VLI编码表:前面提到的那个DC差值为3的数据,通过查找VLI可以发现,整数3位于VLI表格的第2组,因此,可以写成(2)(3)的形式,该形式,称之为DC系数的中间格式。(9) AC系数的行程长度编码(RLC)量化之后的AC系数的特点是,63个系数中含有很多值为0的系数。

15、因此,可以采用行程编码RLC(Run Length Coding)来更进一步降低数据的传输量。利用该编码方式,可以将一个字符串中重复出现的连续字符用两个字节来代替,其中,第一个字节代表重复的次数,第二个字节代表被重复的字符串。例如,(4,6)就代表字符串“6666”。但是,在JPEG编码中,RLC的含义就同其原有的意义略有不同。在JPEG编码中,假设RLC编码之后得到了一个(M,N)的数据对,其中M是两个非零AC系数之间连续的0的个数(即,行程长度),N是下一个非零的AC系数的值。采用这样的方式进行表示,是因为AC系数当中有大量的0,而采用Zigzag扫描也会使得AC系数中有很多连续的0的存在

16、,如此一来,便非常适合于用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,-30) ; (0,-8) ; (2,1) ; (0,0)只处理每对数右边

17、的那个数据,对其进行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标准并没有限制JPEG算法必须用Huffman编码方式或者算术编码方式。 Hu

18、ffman编码:对出现概率大的字符分配字符长度较短的二进制编码,对出现概率小的字符分配字符长度较长的二进制编码,从而使得字符的平均编码长度最短。Huffman编码的原理请参考数据结构中的Huffman树或者最优二叉树。Huffman编码时DC系数与AC系数分别采用不同的Huffman编码表,对于亮度和色度也采用不同的Huffman编码表。因此,需要4张Huffman编码表才能完成熵编码的工作。具体的Huffman编码采用查表的方式来高效地完成。然而,在JPEG标准中没有定义缺省的Huffman表,用户可以根据实际应用自由选择,也可以使用JPEG标准推荐的Huffman表。或者预先定义一个通用的

19、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的图像块的DC系数量化值为12,则当前DC系统同上一个DC系数之间的差值为3,通过查找VLI编码表

20、,可以得到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),(EOB)(0,0) 对于DC系数的中间格式(2)(3)而言,数字2查DC亮度Huffman表得到011,数字3通过查找

21、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系数的中间格式(0,0)而言,查AC亮度Huffman表得到1010; 因此,最后这个8*8子块亮度信息压缩后的数据流为01111,00

22、0,000,000,1010。总共31比特,其压缩比是64*8/31=16.5,大约每个像素用半个比特。JPEG 推荐的DC和AC系数的huffman(哈夫曼)码表 Table K.3 Table for luminance DC coefficient differencesCategory Code length Code word0 2 0001 3 0102 3 011 3 3 1004 3 101 5 3 1106 4 11107 5 111108 6 9 7 10 8 11 9 Table K.4 Table for chrominance DC coefficient diffe

23、rencesCategory Code length Code word0 12 0001 12 012 12 103 13 1104 14 11105 15 111106 16 7 17 8 18 9 19 10 10 11 11 Table K.5 Table for luminance AC coefficients (sheet 1 of 4) Run/Size Code length Code word 0/0 (EOB) 14 1010 0/1 12 00 0/2 12 01 0/3 13 100 0/4 14 1011 0/5 15 11010 0/6 17 0/7 18 0/8

24、 10 0/9 16 00010 0/A 16 00011 1/1 14 1100 1/2 15 11011 1/3 17 1/4 19 1/5 11 1/6 16 00100 1/7 16 00101 1/8 16 00110 1/9 16 00111 1/A 16 01000 2/1 15 11100 2/2 18 2/3 10 2/4 12 0 2/5 16 01001 2/6 16 01010 2/7 16 01011 2/8 16 01100 2/9 16 01101 2/A 16 01110 3/1 16 3/2 19 3/3 12 1 3/4 16 01111 3/5 16 10

25、000 3/6 16 10001 3/7 16 10010 3/8 16 10011 3/9 16 10100 3/A 16 10101Table K.5 (sheet 2 of 4) Run/Size Code length Code word 4/1 16 4/2 10 4/3 16 10110 4/4 16 10111 4/5 16 11000 4/6 16 11001 4/7 16 11010 4/8 16 11011 4/9 16 11100 4/A 16 11101 5/1 17 5/2 11 5/3 16 11110 5/4 16 11111 5/5 16 00000 5/6 1

26、6 00001 5/7 16 00010 5/8 16 00011 5/9 16 00100 5/A 16 00101 6/1 17 6/2 12 0 6/3 16 00110 6/4 16 00111 6/5 16 01000 6/6 16 01001 6/7 16 01010 6/8 16 01011 6/9 16 01100 6/A 16 01101 7/1 18 7/2 12 1 7/3 16 01110 7/4 16 01111 7/5 16 10000 7/6 16 10001 7/7 16 10010 7/8 16 10011 7/9 16 10100 7/A 16 10101

27、8/1 19 8/2 15 0000Run/Size Code length Code word 8/3 16 10110 8/4 16 10111 8/5 16 11000 8/6 16 11001 8/7 16 11010 8/8 16 11011 8/9 16 11100 8/A 16 11101 9/1 19 9/2 16 11110 9/3 16 11111 9/4 16 00000 9/5 16 00001 9/6 16 00010 9/7 16 00011 9/8 16 00100 9/9 16 00101 9/A 16 00110 A/1 19 A/2 16 00111 A/3

28、 16 01000 A/4 16 01001 A/5 16 01010 A/6 16 01011 A/7 16 01100 A/8 16 01101 A/9 16 01110 A/A 16 01111 B/1 10 B/2 16 10000 B/3 16 10001 B/4 16 10010 B/5 16 10011 B/6 16 10100 B/7 16 10101 B/8 16 10110 B/9 16 10111 B/A 16 11000 C/1 10 C/2 16 11001 C/3 16 11010 C/4 16 11011Table K.5 (sheet 4 of 4) Run/S

29、ize Code length Code wordC/5 16 11100 C/6 16 11101 C/7 16 11110 C/8 16 11111 C/9 16 00000 C/A 16 00001 D/1 11 D/2 16 00010 D/3 16 00011 D/4 16 00100 D/5 16 00101 D/6 16 00110 D/7 16 00111 D/8 16 01000 D/9 16 01001 D/A 16 01010 E/1 16 01011 E/2 16 01100 E/3 16 01101 E/4 16 01110 E/5 16 01111 E/6 16 1

30、0000 E/7 16 10001 E/8 16 10010 E/9 16 10011 E/A 16 10100 F/0 (ZRL) 11 F/1 16 10101 F/2 16 10110 F/3 16 10111 F/4 16 11000 F/5 16 11001 F/6 16 11010 F/7 16 11011 F/8 16 11100 F/9 16 11101 F/A 16 11110JPEG文件格式介绍:JPEG文件的存储格式有很多种,但最常用的是JFIF格式,即JPEG File Interchange Format。JPEG文件大体可以分为两个部分:(1) 标记码;由两个字节构

31、成,其中,前一个字节是固定值0XFF代表了一个标记码的开始,后一个字节不同的值代表着不同的含义。需要提醒的是,连续的多个0XFF可以理解为一个0XFF,并表示一个标记码的开始。另外,标记码在文件中一般是以标记代码的形式出现的。例如,SOI的标记代码是0XFFD8,即,如果JPEG文件中出现了0XFFD8,则代表此处是一个SOI标记。(2) 压缩数据;一个完整的两字节标记码的后面,就是该标记码对应的压缩数据了,它记录了关于文件的若干信息。一些典型的标记码,及其所代表的含义如下所示:SOI,Start Of Image, 图像开始,标记代码为固定值0XFFD8,用2字节表示;APP0,Applic

32、ation 0, 应用程序保留标记0,标记代码为固定值0XFFE0,用2字节表示;该标记码之后包含了9个具体的字段:(1) 数据长度:2个字节,用来表示(1)-(9)的9个字段的总长度,即不包含标记代码但包含本字段;(2) 标示符:5个字节,固定值0X4A,表示了字符串“JFIF0”;(3) 版本号:2个字节,一般为0X0102,表示JFIF的版本号为1.2;但也可能为其它数值,从而代表了其它版本号;(4) X,Y方向的密度单位:1个字节,只有三个值可选,0:无单位;1:点数每英寸;2:点数每厘米;(5) X方向像素密度:2个字节,取值范围未知;(6) Y方向像素密度:2个字节,取值范围未知;

33、(7) 缩略图水平像素数目:1个字节,取值范围未知;(8) 缩略图垂直像素数目:1个字节,取值范围未知;(9) 缩略图RGB位图:长度可能是3的倍数,保存了一个24位的RGB位图;如果没有缩略位图(这种情况更常见),则字段(7)(8)的取值均为0;APPn, Application n, 应用程序保留标记n(n=1-15),标记代码为2个字节,取值为0XFFE1-0XFFFF;包含了两个字段:(1) 数据长度,2个字节,表示(1)(2)两个字段的总长度;即,不包含标记代码,但包含本字段;(2) 详细信息:数据长度-2个字节,内容不定;DQT,Define Quantization Table,

34、 定义量化表;标记代码为固定值0XFFDB;包含9个具体字段:(1) 数据长度:2个字节,表示(1)和多个(2)字段的总长度;即,不包含标记代码,但包含本字段;(2) 量化表:数据长度-2个字节,其中包括以下内容:(a)精度及量化表ID,1个字节,高4位表示精度,只有两个可选值,0:8位;1:16位;低4位表示量化表ID,取值范围为0-3;(b)表项,64*(精度取值+1)个字节,例如,8位精度的量化表,其表项长度为64*(0+1)=64字节;本标记段中,(2)可以重复出现,表示多个量化表,但最多只能出现4次;SOFO,Start Of Frame, 帧图像开始,标记代码为固定值0XFFC0;

35、包含9个具体字段:(1) 数据长度:2个字节,(1)-(6)共6个字段的总长度;即,不包含标记代码,但包含本字段;(2) 精度:1个字节,代表每个数据样本的位数;通常是8位;(3) 图像高度:2个字节,表示以像素为单位的图像高度,如果不支持DNL就必须大于0;(4) 图像宽度:2个字节,表示以像素为单位的图像宽度,如果不支持DNL就必须大于0;(5) 颜色分量个数:1个字节,由于JPEG采用YCrCb颜色空间,这里恒定为3;(6) 颜色分量信息:颜色分量个数*3个字节,这里通常为9个字节;并依此表示如下一些信息:(a)颜色分量ID: 1个字节;(b)水平/垂直采样因子:1个字节,高4位代表水平

36、采样因子,低4位代表垂直采样因子;(c)量化表:1个字节,当前分量使用的量化表ID;本标记段中,字段(6)应该重复出现3次,因为这里有3个颜色分量;DHT,Define Huffman Table定义Huffman表,标记码为0XFFC4;包含2个字段:(1) 数据长度,2个字节,表示(1)-(2)的总长度,即,不包含标记代码,但包含本字段;(2) Huffman表,数据长度-2个字节,包含以下字段:(a) 表ID和表类型,1个字节,高4位表示表的类型,取值只有两个;0:DC直流;1:AC交流;低4位,Huffman表ID;需要提醒的是,DC表和AC表分开进行编码;(b) 不同位数的码字数量,

37、16个字节;(c) 编码内容,16个不同位数的码字数量之和(字节);本标记段中,字段(2)可以重复出现,一般需要重复4次。DRI,Define Restart Interval,定义差分编码累计复位的间隔,标记码为固定值0XFFDD;包含2个具体字段:(1) 数据长度:2个字节,取值为固定值0X0004,表示(1)(2)两个字段的总长度;即,不包含标记代码,但包含本字段;(2) MCU块的单元中重新开始间隔:2个字节,如果取值为n,就代表每n个MCU块就有一个RSTn标记;第一个标记是RST0,第二个是RST1,RST7之后再从RST0开始重复;如果没有本标记段,或者间隔值为0,就表示不存在重

38、开始间隔和标记RST;SOS,Start Of Scan,扫描开始;标记码为0XFFDA,包含2个具体字段:(1) 数据长度:2个字节,表示(1)-(4)字段的总长度;(2) 颜色分量数目:1个字节,只有3个可选值,1:灰度图;3:YCrCb或YIQ;4:CMYK;(3) 颜色分量信息:包括以下字段,(a)颜色分量ID:1个字节;(b)直流/交流系数表ID,1个字节,高4位表示直流分量的Huffman表的ID;低4位表示交流分量的Huffman表的ID;(4) 压缩图像数据(a)谱选择开始:1个字节,固定值0X00;(b)谱选择结束:1个字节,固定值0X3F;(c)谱选择:1个字节,固定值0X

39、00;本标记段中,(3)应该重复出现,有多少个颜色分量,就重复出现几次;本段结束之后,就是真正的图像信息了;图像信息直到遇到EOI标记就结束了;EOI,End Of Image,图像结束;标记代码为0XFFD9;另外,需要说明的是,在JPEG中0XFF具有标记的意思,所以在压缩数据流(真正的图像信息)中,如果出现了0XFF,就需要做特别处理了。方法是,如果在图像数据流中遇到0XFF,应该检测其紧接着的字符,如果是:(1)0X00,表示0XFF是图像流的组成部分;需要进行译码;(2)0XD9,表示与0XFF组成标记EOI,即,代表图像流的结束,同时,图像文件结束;(3)0XD0-0XD7,组成RSTn标记,需要忽视整个RSTn标记,即不对当前0XFF和紧接着的0XDn两个字节进行译码,并按RST标记的规则调整译码变量;(4)0XFF,忽略当前0XFF,对后一个0XFF进行判断;(5) 其它数值,忽然当前0XFF,并保留紧接着此数值用于译码;需要说明的是,JPEG文件格式中,一个字(16位)的存储使用的是Motorola格式,而不是Intel格式。也就是说,一个字的高字节(高8位)在数据流的前面,低字节(低8位)在数据流的后面,与平时习惯的Intel格式有所不同。这种字节顺序问题的起

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论