ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:30.46KB ,
资源ID:9800922      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9800922.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(JPEG文件编解码详解.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

JPEG文件编解码详解.docx

1、JPEG文件编解码详解JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写。它由国际电话与电报咨询委员会CCITT(The International Telegraph and Telephone Consultative Committee)与国际标准化组织ISO于1986年联合成立的一个小组,负责制定静态数字图像的编码标准。小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的数字图像压缩编码方法,即JPEG算法。JPEG算法被确定为国际通用标准,其适用范围广泛,除用于静态图像编码外,还推广到电视图像序列的帧内图像压缩。而用

2、JPEG算法压缩出来的静态图片文件称为JPEG文件,扩展名通常为*.jpg、*.jpe*.jpeg。JPEG专家组开发了两种基本的压缩算法、两种数据编码方法、四种编码模式。具体如下:压缩算法:有损的离散余弦变换(Discrete Cosine Transform,DCT);无损的预测技术压缩。数据编码方法:哈夫曼编码;算术编码;编码模式:基于DCT顺序模式:编/解码通过一次扫描完成;基于DCT递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进;无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;层次模式:图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作

3、解码,放弃高分辨率信息。在实际应用中,JPEG图像使用的是离散余弦变换、哈夫曼编码、顺序模式。JPEG压缩编码算法的主要计算步骤如下:(0) 8*8分块。(1)正向离散余弦变换(FDCT)。(2)量化(quantization)。(3) Z字形编码(zigzag scan)。(4)使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码。(5)使用行程长度编码(RLE)对交流系数(AC)进行编码。(6)熵编码。笔者在实践过程中查阅了大量的资料,发现大多数书籍资料和网上资料都是从编码角度分析JPEG的编/解码方式,并且都只是介绍编码过程中的主要方法。所以,本文从解码角度详细分析JPEG的编/解

4、码过程,并且加入许多笔者实践过程中遇到的问题和解决方法,希望从另一个角度说明问题,以更好帮助读者结合其他资料解决问题。不过,介绍解码过程之前,首先要了解JPEG文件中数据的存储格式。一、JPEG文件格式介绍JPEG文件使用的数据存储方式有多种。最常用的格式称为JPEG文件交换格式(JPEG File Interchange Format,JFIF)。而JPEG文件大体上可以分成两个部分:标记码(Tag)和压缩数据。标记码由两个字节构成,其前一个字节是固定值0xFF,后一个字节则根据不同意义有不同数值。在每个标记码之前还可以添加数目不限的无意义的0xFF填充,也就说连续的多个0xFF可以被理解为

5、一个0xFF,并表示一个标记码的开始。而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。常用的标记有SOI、APP0、DQT、SOF0、DHT、DRI、SOS、EOI。注意,SOI等都是标记的名称。在文件中,标记码是以标记代码形式出现。例如SOI的标记代码为0xFFD8,即在JPEG文件中的如果出现数据0xFFD8,则表示此处为一个SOI标记。本文附录列出一张完整的JPEG定义的标记表,供读者查阅。这里仅列出几个常用标记的标记代码、占用字节长度和表示的意义。SOI,Start of Image,图像开始标记代码2字节固定值0xFFD8APP0,Applic

6、ation,应用程序保留标记0标记代码2字节固定值0xFFE0包含9个具体字段:数据长度2字节9个字段的总长度即不包括标记代码,但包括本字段标识符5字节固定值0x4A46494600,即字符串“JFIF0”版本号2字节一般是0x0102,表示JFIF的版本号1.2可能会有其他数值代表其他版本X和Y的密度单位1字节只有三个值可选0:无单位;1:点数/英寸;2:点数/厘米X方向像素密度2字节取值范围未知Y方向像素密度2字节取值范围未知缩略图水平像素数目1字节取值范围未知缩略图垂直像素数目1字节取值范围未知缩略图RGB位图长度可能是3的倍数缩略图RGB位图数据本标记段可以包含图像的一个微缩版本,存为

7、24位的RGB像素。如果没有微缩图像(这种情况更常见),则字段“缩略图水平像素数目”和字段“缩略图垂直像素数目”的值均为0。APPn,Application,应用程序保留标记n,其中n=115(任选)标记代码2字节固定值0xFFE10xFFF包含2个具体字段:数据长度2字节2个字段的总长度即不包括标记代码,但包括本字段详细信息数据长度-2字节内容不定例如,Adobe Photoshop生成的JPEG图像中就用了APP1和APP13两个标记段分别存储了一幅图像的副本。DQT,Define Quantization Table,定义量化表标记代码2字节固定值0xFFDB包含9个具体字段:数据长度2

8、字节字段和多个字段的总长度即不包括标记代码,但包括本字段量化表数据长度-2字节a)精度及量化表ID1字节高4位:精度,只有两个可选值0:8位;1:16位低4位:量化表ID,取值范围为03b)表项(64(精度+1)字节例如8位精度的量化表其表项长度为64(0+1)=64字节本标记段中,字段可以重复出现,表示多个量化表,但最多只能出现4次。SOF0,Start of Frame,帧图像开始标记代码2字节固定值0xFFC0包含9个具体字段:数据长度2字节六个字段的总长度即不包括标记代码,但包括本字段精度1字节每个数据样本的位数通常是8位,一般软件都不支持12位和16位图像高度2字节图像高度(单位:像

9、素),如果不支持DNL就必须0图像宽度2字节图像宽度(单位:像素),如果不支持DNL就必须0颜色分量数1字节只有3个数值可选1:灰度图;3:YCrCb或YIQ;4:CMYK而JFIF中使用YCrCb,故这里颜色分量数恒为3颜色分量信息颜色分量数3字节(通常为9字节)a)颜色分量ID1字节b)水平/垂直采样因子1字节高4位:水平采样因子低4位:垂直采样因子(曾经看到某资料把这两者调转了)c)量化表1字节当前分量使用的量化表的ID本标记段中,字段应该重复出现,有多少个颜色分量(字段),就出现多少次(一般为3次)。DHT,Difine Huffman Table,定义哈夫曼表标记代码2字节固定值0x

10、FFC4包含2个具体字段:数据长度2字节字段和多个字段的总长度即不包括标记代码,但包括本字段哈夫曼表数据长度-2字节a)表ID和表类型1字节高4位:类型,只有两个值可选0:DC直流;1:AC交流低4位:哈夫曼表ID,注意,DC表和AC表分开编码b)不同位数的码字数量16字节c)编码内容16个不同位数的码字数量之和(字节)本标记段中,字段可以重复出现(一般4次),也可以致出现1次。例如,Adobe Photoshop生成的JPEG图片文件中只有1个DHT标记段,里边包含了4个哈夫曼表;而Macromedia Fireworks生成的JPEG图片文件则有4个DHT标记段,每个DHT标记段只有一个哈

11、夫曼表。DRI,Define Restart Interval,定义差分编码累计复位的间隔标记代码2字节固定值0xFFDD包含2个具体字段:数据长度2字节固定值0x0004,两个字段的总长度即不包括标记代码,但包括本字段MCU块的单元中的重新开始间隔2字节设其值为n,则表示每n个MCU块就有一个RSTn标记。第一个标记是RST0,第二个是RST1等,RST7后再从RST0重复。如果没有本标记段,或间隔值为0时,就表示不存在重开始间隔和标记RSTSOS,Start of Scan,扫描开始12字节标记代码2字节固定值0xFFDA包含2个具体字段:数据长度2字节两个字段的总长度即不包括标记代码,但

12、包括本字段颜色分量数1字节应该和SOF中的字段的值相同,即:1:灰度图是;3:YCrCb或YIQ;4:CMYK。而JFIF中使用YCrCb,故这里颜色分量数恒为3颜色分量信息 a)颜色分量ID1字节 b)直流/交流系数表号1字节高4位:直流分量使用的哈夫曼树编号低4位:交流分量使用的哈夫曼树编号压缩图像数据 a)谱选择开始1字节固定值0x00 b)谱选择结束1字节固定值0x3F c)谱选择1字节在基本JPEG中总为00本标记段中,字段应该重复出现,有多少个颜色分量(字段),就出现多少次(一般为3次)。本段结束后,紧接着就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束,一般就是以EO

13、I标记表示结束。EOI,End of Image,图像结束2字节标记代码2字节固定值0xFFD9这里补充说明一下,由于在JPEG文件中0xFF具有标志性的意思,所以在压缩数据流(真正的图像信息)中出现0xFF,就需要作特别处理。具体方法是,在数据0xFF后添加一个没有意义的0x00。换句话说,如果在图像数据流中遇到0xFF,应该检测其紧接着的字符,如果是1)0x00,则表示0xFF是图像流的组成部分,需要进行译码;2)0xD9,则与0xFF组成标记EOI,则图像流结束,同时图像文件结束;3)0xD00xD7,则组成RSTn标记,则要忽视整个RSTn标记,即不对当前0xFF和紧接的0xDn两个字

14、节进行译码,并按RST标记的规则调整译码变量;3)0xFF,则忽视当前0xFF,对后一个0xFF再作判断;4)其他数值,则忽视当前0xFF,并保留紧接的此数值用于译码。二、JPEG解码过程详解下面来详细讲述JPEG文件的解码过程。1读入文件的相关信息按照上述的JPEG文件数据存储方式,把要解码的文件的相关信息一一读出,为接下来的解码工作做好准备。参考方法是,设计一系列的结构体对应各个标记,并存储标记内表示的信息。其中图像长宽、多个量化表和哈夫曼表、水平/垂直采样因子等多项信息比较重要。以下给出读取过程中的两个问题。1)整个文件的大体结构JFIF格式的JPEG文件(*.jpg)的一般顺序为:SO

15、I(0xFFD8)APP0(0xFFE0)APPn(0xFFEn)可选DQT(0xFFDB)SOF0(0xFFC0)DHT(0xFFC4)SOS(0xFFDA)压缩数据EOI(0xFFD9)2)字的高低位问题JPEG文件格式中,一个字(16位)的存储使用的是Motorola格式,而不是Intel格式。也就是说,一个字的高字节(高8位)在数据流的前面,低字节(低8位)在数据流的后面,与平时习惯的Intel格式不一样。.3)读出哈夫曼表数据a)理论说明在标记段DHT内,包含了一个或者多个的哈夫曼表。对于单一个哈夫曼表,应该包括了三部分:哈夫曼表ID和表类型这个字节的值为一般只有四个0x00、0x0

16、1、0x10、0x11。0x00表示DC直流0号表;0x01表示DC直流1号表;0x10表示AC交流0号表;0x11表示AC交流1号表。不同位数的码字数量JPEG文件的哈夫曼编码只能是116位。这个字段的16个字节分别表示116位的编码码字在哈夫曼树中的个数。编码内容这个字段记录了哈夫曼树中各个叶子结点的权。所以,上一字段(不同位数的码字数量)的16个数值之和就应该是本字段的长度,也就是哈夫曼树中叶子结点个数。b)举例说明以下面一段哈夫曼表数据举例说明(数据全部以16进制表示):11000202000501060100000000000000000001110221033141125161 7

17、1 81 91 22 1332红色部分(第1字节)为哈夫曼表ID和表类型,其值0x11表示此部分数据描述的是AC交流1号表。蓝色部分(217字节)为不同位数的码字的数量。这16个数值实际意义为:没有1位和4位的哈夫曼码字;2位和3位的码字各有2个;5位码字有5个;6位和8位码字各有1个;7位码字各有6个;没有9位或以上的码字。绿色部分(1834字节)为编码内容。由蓝色部分数据知道,此哈夫曼树有0+2+2+0+5+1+6+1=17个叶子结点,即本字段应该有17个字节。这段数据表示17个叶子结点按从小到大排列,其权值依次为0、1、11、2、21、3、31、414)建立哈夫曼树a)理论说明在读出哈夫

18、曼表的数据后,就要建立哈夫曼树。具体方法为:1)第一个码字必定为0。如果第一个码字位数为1,则码字为0;如果第一个码字位数为2,则码字为00;如此类推。2)从第二个码字开始,如果它和它前面的码字位数相同,则当前码字为它前面的码字加1;如果它的位数比它前面的码字位数大,则当前码字是前面的码字加1后再在后边添若干个0,直至满足位数长度为止。b)举例说明继续以上边的例子说明问题。由于没有1位的码字,所以第一个码字的位数为2,即码字为00;由于2位的码字有两个,所以第二个码字位数仍为2,即码字为00+1=01;第三个码字为3位,比第二个码字长1位,所以第三个码字为:01+1=10,然后再添1个“0”,

19、得100;如此类推,最后得到这个哈夫曼树如下:序号码字长度码字权值12000x0022010x01331000x11431010x0255110000x2165110010x0375110100x3185110110x4195111000x121061110100x5111711101100x6112711101110x7113711110000x8114711110010x9115711110100x2216711110110x13178111110000x32特别注意的是,如果中间有某个位数的码字缺失,例如没有4位码字,则应该在3位码字加1后,添加“00”补足5位,形成下一个5位码字。在准

20、备好所有的图片信息后,就可以对图片数据进行解码了。2初步了解图像数据流的结构1)理论说明分析图像数据流的结构,笔者准备以一个从宏观到微观的顺序为读者详细剖析,即:数据流最小编码单元数据单元与颜色分量。a)在图片像素数据流中,信息可以被分为一段接一段的最小编码单元(Minimum Coded Unit,MCU)数据流。所谓MCU,是图像中一个正方矩阵像素的数据。矩阵的大小是这样确定的:查阅标记SOF0,可以得到图像不同颜色分量的采样因子,即Y、Cr、Cb三个分量各自的水平采样因子和垂直采样因子。大多图片的采样因子为4:1:1或1:1:1。其中,4:1:1即(2*2):(1*1):(1*1);1:1:1即(1*1):(1*1):(1*1)。记三个分量中水平采样因子最大值为Hmax,垂直采样因子最大值为Vmax,那么单个MCU矩阵的宽就是Hmax*8像素,高就是Vmax*8像素。如果,整幅图像的宽度和高度不是MCU宽度和高度的整数倍,那么编码时会用某些数值填充进去,保证解码过程中MCU的完整性(解码完成后,可直接忽视图像宽度和高度外的数据)。在数据流中,MCU的排列方法是从左到右,从上到下。b)每个MCU又分为若干个数据

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1