JPEG图片资料编解码详解.docx
《JPEG图片资料编解码详解.docx》由会员分享,可在线阅读,更多相关《JPEG图片资料编解码详解.docx(22页珍藏版)》请在冰豆网上搜索。
![JPEG图片资料编解码详解.docx](https://file1.bdocx.com/fileroot1/2022-10/13/a2d95931-904a-4e4a-bae7-77db02825fab/a2d95931-904a-4e4a-bae7-77db02825fab1.gif)
JPEG图片资料编解码详解
JPEG文件编/解码详解
(1)
JPEG(JointPhotographicExpertsGroup)是联合图像专家小组的英文缩写。
它由国际电话与电报咨询委员会CCITT(TheInternationalTelegraphandTelephoneConsultativeCommittee)与国际标准化组织ISO于1986年联合成立的一个小组,负责制定静态数字图像的编码标准。
小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的数字图像压缩编码方法,即JPEG算法。
JPEG算法被确定为国际通用标准,其适用范围广泛,除用于静态图像编码外,还推广到电视图像序列的帧内图像压缩。
而用JPEG算法压缩出来的静态图片文件称为JPEG文件,扩展名通常为*.jpg、*.jpe*.jpeg。
JPEG专家组开发了两种基本的压缩算法、两种数据编码方法、四种编码模式。
具体如下:
压缩算法:
●有损的离散余弦变换(DiscreteCosineTransform,DCT);
●无损的预测技术压缩。
数据编码方法:
●哈夫曼编码;
●算术编码;
编码模式:
●基于DCT顺序模式:
编/解码通过一次扫描完成;
●基于DCT递进模式:
编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进;
●无损模式:
基于DPCM,保证解码后完全精确恢复到原图像采样值;
●层次模式:
图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息。
在实际应用中,JPEG图像使用的是离散余弦变换、哈夫曼编码、顺序模式。
JPEG压缩编码算法的主要计算步骤如下:
(0)8*8分块。
(1)正向离散余弦变换(FDCT)。
(2)量化(quantization)。
(3)Z字形编码(zigzagscan)。
(4)使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码。
(5)使用行程长度编码(RLE)对交流系数(AC)进行编码。
(6)熵编码。
笔者在实践过程中查阅了大量的资料,发现大多数书籍资料和网上资料都是从编码角度分析JPEG的编/解码方式,并且都只是介绍编码过程中的主要方法。
所以,本文从解码角度详细分析JPEG的编/解码过程,并且加入许多笔者实践过程中遇到的问题和解决方法,希望从另一个角度说明问题,以更好帮助读者结合其他资料解决问题。
不过,介绍解码过程之前,首先要了解JPEG文件中数据的存储格式。
一、JPEG文件格式介绍
JPEG文件使用的数据存储方式有多种。
最常用的格式称为JPEG文件交换格式(JPEGFileInterchangeFormat,JFIF)。
而JPEG文件大体上可以分成两个部分:
标记码(Tag)和压缩数据。
标记码由两个字节构成,其前一个字节是固定值0xFF,后一个字节则根据不同意义有不同数值。
在每个标记码之前还可以添加数目不限的无意义的0xFF填充,也就说连续的多个0xFF可以被理解为一个0xFF,并表示一个标记码的开始。
而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。
常用的标记有SOI、APP0、DQT、SOF0、DHT、DRI、SOS、EOI。
注意,SOI等都是标记的名称。
在文件中,标记码是以标记代码形式出现。
例如SOI的标记代码为0xFFD8,即在JPEG文件中的如果出现数据0xFFD8,则表示此处为一个SOI标记。
本文附录列出一张完整的JPEG定义的标记表,供读者查阅。
这里仅列出几个常用标记的标记代码、占用字节长度和表示的意义。
● SOI,StartofImage,图像开始
◆ 标记代码 2字节 固定值0xFFD8
● APP0,Application,应用程序保留标记0
◆ 标记代码 2字节 固定值0xFFE0
◆ 包含9个具体字段:
①数据长度 2字节 ①~⑨9个字段的总长度
即不包括标记代码,但包括本字段
②标识符 5字节 固定值0x4A46494600,即字符串“JFIF0”
③版本号 2字节 一般是0x0102,表示JFIF的版本号1.2
可能会有其他数值代表其他版本
④X和Y的密度单位 1字节 只有三个值可选
0:
无单位;1:
点数/英寸;2:
点数/厘M
⑤X方向像素密度 2字节 取值范围未知
⑥Y方向像素密度 2字节 取值范围未知
⑦缩略图水平像素数目 1字节 取值范围未知
⑧缩略图垂直像素数目 1字节 取值范围未知
⑨缩略图RGB位图 长度可能是3的倍数 缩略图RGB位图数据
本标记段可以包含图像的一个微缩版本,存为24位的RGB像素。
如果没有微缩图像(这种情况更常见),则字段⑦“缩略图水平像素数目”和字段⑧“缩略图垂直像素数目”的值均为0。
● APPn,Application,应用程序保留标记n,其中n=1~15(任选)
◆ 标记代码 2字节 固定值0xFFE1~0xFFF
◆ 包含2个具体字段:
①数据长度 2字节 ①~②2个字段的总长度
即不包括标记代码,但包括本字段
② 详细信息 数据长度-2字节 内容不定
例如,AdobePhotoshop生成的JPEG图像中就用了APP1和APP13两个标记段分别存储了一幅图像的副本。
● DQT,DefineQuantizationTable,定义量化表
◆ 标记代码 2字节 固定值0xFFDB
◆ 包含9个具体字段:
①数据长度 2字节 字段①和多个字段②的总长度
即不包括标记代码,但包括本字段
② 量化表 数据长度-2字节
a) 精度及量化表ID 1字节 高4位:
精度,只有两个可选值
0:
8位;1:
16位
低4位:
量化表ID,取值范围为0~3
b) 表项 (64×(精度+1))字节 例如8位精度的量化表
其表项长度为64×(0+1)=64字节
本标记段中,字段②可以重复出现,表示多个量化表,但最多只能出现4次。
● SOF0,StartofFrame,帧图像开始
◆ 标记代码 2字节 固定值0xFFC0
◆ 包含9个具体字段:
①数据长度 2字节 ①~⑥六个字段的总长度
即不包括标记代码,但包括本字段
②精度 1字节 每个数据样本的位数
通常是8位,一般软件都不支持12位和16位
③图像高度 2字节 图像高度(单位:
像素),如果不支持DNL就必须>0
④图像宽度 2字节 图像宽度(单位:
像素),如果不支持DNL就必须>0
⑤颜色分量数 1字节 只有3个数值可选
1:
灰度图;3:
YCrCb或YIQ;4:
CMYK
而JFIF中使用YCrCb,故这里颜色分量数恒为3
⑥颜色分量信息 颜色分量数×3字节(通常为9字节)
a) 颜色分量ID 1字节
b) 水平/垂直采样因子 1字节 高4位:
水平采样因子
低4位:
垂直采样因子
(曾经看到某资料把这两者调转了)
c) 量化表 1字节 当前分量使用的量化表的ID
本标记段中,字段⑥应该重复出现,有多少个颜色分量(字段⑤),就出现多少次(一般为3次)。
● DHT,DifineHuffmanTable,定义哈夫曼表
◆ 标记代码 2字节 固定值0xFFC4
◆ 包含2个具体字段:
①数据长度 2字节 字段①和多个字段②的总长度
即不包括标记代码,但包括本字段
② 哈夫曼表 数据长度-2字节
a) 表ID和表类型 1字节 高4位:
类型,只有两个值可选