一、简述
JPEG是一个压缩标准,又可分为标准JPEG、渐进式JPEG及JPEG2000三种:
①标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支持最高级别的压缩,不过,这种压缩是有损耗的。此类型图片在网页下载时只能由上而下依序显示图片,直到图片资料全部下载完毕,才能看到全貌。
②渐进式JPEG:渐进式JPG为标准JPG的改良格式,支持交错,可以在网页下载时,先呈现出图片的粗略外观后,再慢慢地呈现出完整的内容,渐进式JPG的文件比标准JPG的文件要来得小。
③JPEG2000:新一代的影像压缩法,压缩品质更好,其压缩率比标准JPEG高约30%左右,同时支持有损和无损压缩。一个极其重要的特征在于它能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,让图像由朦胧到清晰显示。
以一幅24位彩色图像为例,JPEG的压缩分为四个步骤:
①颜色转换:在将彩色图像进行压缩之前,必须先对颜色模式进行数据转换。转换完成之后还需要进行数据采样。
②DCT变换:是将图像信号在频率域上进行变换,分离出高频和低频信息的处理过程,然后再对图像的高频部分(即图像细节)进行压缩。首先以象素为单位将图像划分为多个8×8的矩阵,然后对每一个矩阵作DCT变换。把8×8的象素矩阵变成8×8的频率系数矩阵(所谓频率就是颜色改变的速度),频率系数都是浮点数。
③量化:由于下面第四步编码过程中使用的码本都是整数,因此要对频率系数进行量化,将之转换为整数。数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是造成图像压缩后失真的主要原因。这一过程中,质量因子的选取至为重要。值选得大,可以大幅度提高压缩比,但是图像质量就比较差,质量因子越小图像重建质量越好,但是压缩比越低。
④编码:编码是基于统计特性的方法。
四个步骤都完成后的JPEG文件,其基本数据结构为两大类型:“段”和经过压缩编码的图像数据。
二、数据结构
1.段的一般结构如下表所示:
表1:段的一般结构
-----------------------------------------------------------------
名称字节数数据说明
-----------------------------------------------------------------
段标识1FF每个新段的开始标识
段类型1类型编码(称作“标记码”)
段长度2包括段内容和段长度本身,不包括段标识和段类型
段内容≤65533字节
-----------------------------------------------------------------
说明:
①JPG文件中所有关于宽度高度长度间隔这一类数据,凡是>1字节的,均采用Motorola格式,即:高位在前,低位在后。
②有些段没有长度描述也没有内容,只有段标识和段类型。文件头和文件尾均属于这种段。
③段与段之间无论有多少FF都是合法的,这些FF称为“填充字节”,必须被忽略掉。
2.段类型有30种,但只有10种是必须被所有程序识别的,其它的类型都可以忽略。所以下面只列出这10种类型。
表2:段类型
---------------------------------------
名称标记码说明
---------------------------------------
SOID8文件头
EOID9文件尾
SOF0C0帧开始(标准JPEG)
SOF1C1同上
DHTC4定义Huffman表(霍夫曼表)
SOSDA扫描行开始
DQTDB定义量化表
DRIDD定义重新开始间隔
APP0E0定义交换格式和图像识别信息
COMFE注释
-----------------------------------------------------------
说明:有的文章也将DNL段(标记码=DC,定义扫描行数)列为必须段。
3.以下按一般JPEG文件的段排列顺序详细介绍各种段的结构:
表3:SOI(文件头)
-----------------
名称字节数值
-----------------
段标识1FF
段类型1D8
-----------------
说明:这两个字节构成了JPEG文件头。
表4:APP0(图像识别信息)
--------------------------------------------------------------------------
名称字节数值说明
--------------------------------------------------------------------------
段标识1FF
段类型1E0
段长度20010如果有RGB缩略图就=16+3n
(以下为段内容)
交换格式54A46494600“JFIF”的ASCII码
主版本号1
次版本号1
密度单位10=无单位;1=点数/英寸;2=点数/厘米
X像素密度2水平方向的密度
Y像素密度2垂直方向的密度
缩略图X像素1缩略图水平像素数目
缩略图Y像素1缩略图垂直像素数目
(如果“缩略图X像素”和“缩略图Y像素”的值均>0,那么才有下面的数据)
RGB缩略图3×nn=缩略图像素总数=缩略图X像素×缩略图Y像素
--------------------------------------------------------------------------
说明:
①JFIF是JPEGFileInterchangeFormat的缩写,即JPEG文件交换格式,另外还有TIFF等格式,很少用
②“如果有RGB缩略图就=16+3n”是什么意思呢?比如说“缩略图X像素”和“缩略图Y像素”的值均为48,就表示有一个48×48像素的缩略图(n=48×48),缩略图是24位真彩位图,用3个字节来表示一个像素,所以共占用3n个字节。但大多数JPG文件都没有这个“鸡肋”缩略图。
表5:COM(注释)
--------------------------------------------------------------------------
名称字节数值说明
--------------------------------------------------------------------------
段标识1FF
段类型1FE
段长度2其值=注释字符的字节数+2
段内容注释字符
--------------------------------------------------------------------------
说明:有的JPEG文件没有这个段。
表6:DQT(定义量化表)
--------------------------------------------------------------------------
名称字节数值说明
--------------------------------------------------------------------------
段标识1FF
段类型1DB
段长度243其值=3+n(当只有一个QT时)
(以下为段内容)
QT信息10-3位:QT号
4-7位:QT精度(0=8bit,1字节;否则=16bit,2字节)
QTnn=64×QT精度的字节数
--------------------------------------------------------------------------
说明:
①JPEG文件一般有2个DQT段,为Y值(亮度)定义1个,为C值(色度)定义1个。
②一个DQT段可以包含多个QT,每个都有自己的信息字节
表7:SOF0(图像基本信息)
--------------------------------------------------------------------------
名称字节数值说明
--------------------------------------------------------------------------
段标识1FF
段类型1C0
段长度2其值=8+组件数量×3
(以下为段内容)
样本精度18每个样本位数(大多数软件不支持12和16)
图片高度2
图片宽度2
组件数量131=灰度图,3=YCbCr/YIQ彩色图,4=CMYK彩色图
(以下每个组件占用3字节)
组件ID11=Y,2=Cb,3=Cr,4=I,5=Q
采样系数10-3位:垂直采样系数
4-7位:水平采样系数
量化表号1
---------------------------------------------------------------------------
说明:
①JPEG大都采用yCrCb色彩模型(y表示亮度,Cr红色分量,Cb表示蓝色分量),所以组件数量一般=3
②样本就是单个像素的颜色分量,也可理解为一个样本就是一个组件
③采样系数是实际采样方式与最高采样系数之比,而最高采样系数一般=0.5(分数表示为1/2)。比如说,垂直采样系数=2,那么2×0.5=1,表示实际采样方式是每个点采一个样,也就是逐点采样;如果垂直采样系数=1,那么:1×0.5=0.5(分数表示为1/2),表示每2个点采一个样
表8:DHT(定义Huffman表)
--------------------------------------------------------------------------
名称字节数值说明
--------------------------------------------------------------------------
段标识1FF
段类型1C4
段长度2其值=19+n(当只有一个HT表时)
(以下为段内容)
HT信息10-3位:HT号
4位:HT类型,0=DC表,1=AC表
5-7位:必须=0
HT位表16这16个数的和应该≤256
HT值表nn=表头16个数的和
--------------------------------------------------------------------------
说明:
①JPEG文件里有2类Haffman表:一类用于DC(直流量),一类用于AC(交流量)。一般有4个表:亮度的DC和AC,色度的DC和AC。最多可有6个。
②一个DHT段可以包含多个HT表,每个都有自己的信息字节
③HT表是一个按递增次序代码长度排列的符号表。
表9:DRI(定义重新开始间隔)
--------------------------------------------------------------------------
名称字节数值说明
--------------------------------------------------------------------------
段标识1FF
段类型1DD
段长度24
(以下为段内容)
开始间隔2n 复位标记的间隔距离
---------------------------------------------------------------------------
说明:
①开始间隔表示在压缩数据流中,每隔n个MCU块就有一个RST标记,RST标记将Huffman的解码数据流复位,DC也重新从0开始,因此,RST标记是一种复位标记
②RST标记是一种特殊的段,它只具有段标识和段类型(长度=2字节),但它不是独立的段,只能穿插在数据流中(文件头和文件尾段也只有段标识和段类型,却都是独立的段)。
③RST标记共有8个(RST0-RST7),从RST0起开始使用,然后是RST1....直至RST7,再从RST0重复。
④RST标记的标识码是FFD0-FFD7,对应RST0-RST7
⑤笔者查看了许多自己电脑上的JPG文件的数据,未发现DRI段和RST标记,所以无法进行详尽的考察
表10:SOS(扫描行开始)
--------------------------------------------------------------------------