JPEG编码过程详解
- 格式:docx
- 大小:61.75 KB
- 文档页数:17
jpeg 编码原理
JPEG编码的原理主要涉及到三个关键步骤:色彩空间的转换、离散余弦变
换(DCT)和量化。
以下是这些步骤的详细解释:
1. 色彩空间的转换:JPEG编码首先将图像从RGB色彩空间转换为YCbCr
色彩空间。
RGB色彩空间由红色、绿色和蓝色三个分量组成,而YCbCr色彩空间由亮度(Y)分量和两个色度(Cb和Cr)分量组成。
这种转换是基
于人眼对亮度的敏感度高于对色彩敏感度的特性,因此对亮度的变化比对色彩的变化更为敏感。
2. 离散余弦变换(DCT):转换后的图像数据会进行离散余弦变换,这是一种将图像数据从空间域转换到频域的过程。
DCT变换的目的是将图像中的
数据集中到少数的几个系数上,这样可以去除图像中的空间冗余,便于后续的压缩。
变换后的图像能量集中在左上角,其中低频部分集中于左上角,高频部分集中于右下角。
3. 量化:这一步是为了去除数据中的冗余,并且减少表示图像所需的数据量。
JPEG采用基于人眼视觉特性的量化方法,对DCT变换后的系数进行量化。
量化过程会减少数据的精度,但不会丢失原始图像的信息。
经过上述三个步骤后,JPEG编码通过使用熵编码进一步压缩数据,最后生
成JPEG格式的图像文件。
以上是JPEG编码的基本原理,通过理解这些原
理,有助于更好地理解JPEG压缩的优缺点,以及如何优化JPEG图像的压缩效果。
jpeg编码原理JPEG编码原理JPEG是一种常用的图像压缩格式,它可以将图像压缩至原始大小的1/10或更小,而且不会影响图像的质量。
JPEG编码原理是基于离散余弦变换(DCT)和量化技术。
1. 离散余弦变换(DCT)在JPEG编码中,图像被分成8x8个像素块,每个块都被视为一个矩阵。
通过对这些矩阵进行离散余弦变换(DCT),可以将每个块转换为一组频率系数。
离散余弦变换是一种将时域信号转换为频域信号的方法。
在JPEG中,每个块都被视为一个时域信号,并通过离散余弦变换将其转换为频域信号。
这些频率系数表示了该块中各种不同频率的分量。
2. 量化在经过DCT后,得到了每个块的频率系数。
但是由于人眼对于高频细节的感知能力较差,因此在JPEG编码中采用了量化技术来减少高频分量化就是将每个频率系数除以一个固定值,并四舍五入取整。
由于高频分量较大,因此它们被量化后会变得更小,从而减少了数据量。
3. 压缩在经过DCT和量化后,每个块都被转换为一组频率系数,并且高频分量已经被减少。
这些频率系数可以被进一步压缩,从而减少文件大小。
JPEG编码使用了霍夫曼编码技术来压缩这些频率系数。
霍夫曼编码是一种无损压缩技术,它可以将出现频率较高的符号用较短的编码表示,从而减少数据量。
4. 解压在解压JPEG图像时,首先需要将霍夫曼编码还原为频率系数。
然后对这些频率系数进行逆量化和逆离散余弦变换(IDCT),从而恢复原始图像。
逆量化是将每个频率系数乘以一个固定值,并四舍五入取整。
逆离散余弦变换是将每个块的频率系数转换回时域信号,从而恢复原始图像。
JPEG编码原理是基于离散余弦变换和量化技术的。
通过DCT将图像分解为一组频率系数,并采用量化技术减少高频分量,然后使用霍夫曼编码压缩这些频率系数。
在解压时,需要将霍夫曼编码还原为频率系数,并进行逆量化和逆离散余弦变换来恢复原始图像。
JPEG编码介绍JPEG是一个比较成熟的图像有损压缩格式,图片经过转化变为JPEG图像后,仅会丢失人眼不易察觉的一些细节,在图像的清晰与大小中找到了一个很好的平衡点。
JPEG是Joint Photographic Exports Group的英文缩写,中文称之为联合图像专家小组。
该小组隶属于ISO国际标准化组织,主要负责定制静态数字图像的编码方法,即所谓的JPEG算法。
JPEG专家组开发了两种基本的压缩算法、两种熵编码方法、四种编码模式。
在实际应用中,JPEG图像编码算法使用的大多是离散余弦变换、Huffman编码、顺序编码模式,被人们称为JPEG的基本系统。
下面将依次介绍JPEG编码的主要过程。
(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-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三个分量各采用一个字节进行采样;而JPEG图片中,通常采用两种采样方式:YUV411和YUV422,它们所代表的意义是Y,Cb,Cr三个分量的数据取样比例一般是4:1:1或者4:2:2(4:1:1含义就是:在2x2的单元中,本应分别有4个Y,4个U,4个V值,用12个字节进行存储。
JPEG编码原理概述本⽂简要概述 JPEG 基本系统的编码流程。
编码需要经过 DCT、量化、Z 序列化、系数编码(DC 差分脉冲调制编码、DC 系数中间格式计算、AC 差分脉冲调制编码、AC 系数中间格式计算)、熵编码五个步骤,最后按指定格式进⾏封装,成为⼀张 JPEG 图⽚。
图⽚被分割为若⼲ 8×8 块后,每个块进⾏离散余弦变换(DCT),其⽬的是将图像块按频率分解,得到其频谱。
类似傅⾥叶变换,DCT 的⽬的是将图像分解为不同频率的基本分量的线性组合。
事实上,DCT 是 DFT 抹去虚(奇)部的特殊形式。
由于实偶函数的 DFT 仍然是实偶函数,我们将时域函数倍增延拓成偶函数,于是频域也成为实偶函数。
当然在存储时可以折半以消除冗余。
为何要求 DCT?对每⼀个图像块,如果⼀定要舍弃,我们会尽可能多保留其低频分量,⽽降低⾼频分量的分辨率。
同时,⾼频分量通常也的确是较少的,⽽直流分量,虽然数值⼤,但相邻块的直流分量差别较⼩。
因此我们对低频分量取较低的量化系数,⽽对⾼频分量取较⾼的量化系数。
所谓量化,就是将浮点(实现上可能只是以更⾼精度的整数表⽰形式存在)值 x 转化为阶跃的整数值 y 表⽰的过程,⽽ y=round(x/q) 中的 q 就是量化系数。
随后我们进⾏ Z 序列化,将⼆维矩阵按 Z 形拍扁成向量。
考虑到相邻块 DC 分量差异⼩,我们⾸先将 DC 分量与上⼀个块做差。
这个过程称为差分脉冲调制编码。
如今,向量中存在⼤量的 0,⽽绝对值⼩的数字出现的概率也远⼤于绝对值⼤者。
我们采⽤⾏程编码(RLE),将序列切成形如 0,0,…,0,x 的若⼲段,每段由 y(≥0) 个 0 和⼀个 x(>0) 组成,记作 (y,len(x),x),其中 len(x) 是 x 在反码⼆进制表⽰下的长度。
这种三元组表⽰形式称为中间格式。
(注:这⾥图上将 DC 分量也⼀把揉进去了,严格来说是分开的,RLE 只考虑 AC 分量)现在考虑 (y,l,x) 三元组的编码。
jpeg 编码原理-回复JPEG(Joint Photographic Experts Group)是一种图像压缩算法,被广泛应用于数字图像的存储和传输中。
JPEG编码原理是将图像分块、转换为频域表示、量化和熵编码等一系列步骤的组合,以尽可能地减小图像文件的大小同时保持图像质量。
JPEG编码的步骤如下:1. 图像分块:JPEG编码将输入图像划分为8×8个像素的块,每个块都经过单独的处理。
这样的划分能够更好地保持图像的局部特征,并使得后续的处理更加有效。
2. 转换为频域表示:每个划分的图像块通过应用离散余弦变换(Discrete Cosine Transform,DCT)来转换为频域表示。
DCT能够将像素值的空域表示转换为一系列频率分量的频域表示。
经过DCT变换后,低频分量会集中在左上角,而高频分量则分布在右下角。
3. 量化:DCT变换后得到的频域表示,对于高频分量的维度信息对图像视觉感知的贡献较小。
因此,JPEG采用了量化表来将高频分量进行抑制。
量化过程即通过除以一个量化矩阵,将频域表示的每个系数分量变为整数。
4. 压缩和熵编码:通过量化后的频域表示得到的整数系数矩阵,一般情况下会有许多零值,这是由于量化矩阵的零值化导致的。
这些零值可以被很好地压缩。
JPEG 采用了霍夫曼编码来实现熵编码,通过对系数的零值进行编码,从而将图像数据进行高效的压缩。
5. 解码:JPEG解码是编码过程的逆过程。
解码时,将经过熵编码的图像数据解压为量化后的频域表示系数。
然后通过反量化和反DCT变换得到每个图像块的空域表示。
最后,将所有块合并,得到完整的解码图像。
JPEG编码通过利用人类视觉系统的特性来设计其压缩算法,使得图像在被压缩的同时尽量减少人眼可察觉的细节损失。
这使得JPEG编码成为了一种非常常见的图像压缩算法,被广泛应用于数字图像的存储、传输和显示中。
无论是从存储空间的角度考虑,还是为了在网络中高效传输图像数据,JPEG编码都在图像处理中扮演着关键的角色。
jpeg编解码原理JPEG编解码原理JPEG是一种常用的图像压缩格式,它的编解码原理是基于离散余弦变换(Discrete Cosine Transform,DCT)和量化。
在JPEG编码过程中,图像首先被分割成8x8的小块,每个小块进行DCT变换,将空间域的数据转换为频域的数据。
这个过程可以看作是将图像分解为一系列频率成分,每个小块的DCT系数表示该频率成分的强度和位置。
接下来,对DCT系数进行量化。
量化是指将连续的数值变为离散的数值,以减少需要存储或传输的数据量。
量化过程中,需要使用一个量化矩阵,它是由JPEG标准规定的。
量化后的结果是一个系数矩阵,其中大部分系数都为0,只有少量的系数保留,这些系数通常是在高频区域,因为人眼对高频信息不太敏感。
量化后的系数矩阵被编码为比特流,这个过程称为熵编码。
熵编码使用的是一种自适应的算法,它可以根据数据的统计特征来选择不同的编码方式,以达到更好的压缩效果。
在JPEG解码过程中,先将比特流解码为系数矩阵,然后将系数矩阵进行反量化和反DCT变换,得到恢复后的图像。
解码过程中也需要使用相同的量化矩阵和熵编码算法来还原原始的系数矩阵。
总结一下,JPEG编解码原理可以分为以下几个步骤:1.将图像分割成8x8的小块;2.对每个小块进行DCT变换,得到系数矩阵;3.对系数矩阵进行量化,得到量化后的系数矩阵;4.将量化后的系数矩阵编码为比特流,使用熵编码算法;5.解码时,将比特流解码为系数矩阵;6.对系数矩阵进行反量化和反DCT变换,得到恢复后的图像。
JPEG编解码原理的核心是DCT和量化。
DCT可以将空间域的数据转换为频域的数据,量化可以将连续的数值变为离散的数值,以减少需要存储或传输的数据量。
这两个过程的相互作用,使得JPEG 可以在保持图像质量的前提下,大大减少图像的存储和传输开销。
JPEG编码原理摘要:JPEG不仅是计算机处理中一种广泛适用的压缩图像标准方式,而且是最普遍在万维网上被用来储存和传输照片的格式。
它的压缩编码过程主要是对图像进行离散余弦变换后加以量化,并进行熵编码。
关键字:离散余弦变换;量化;Huffman 编码;行程编码JPEG是Joint Photographic Experts Group(联合图像专家组)的缩写,文件后辍名为".jpg"或".jpeg",这个名称代表Joint Photographic Experts Group(联合JPEG图片图像专家组),这是1993年公布第1个灰度及彩色静止图像的国际标准。
它支持8位和24位色彩的压缩位图格式,适合在网络上传输。
JPEG压缩算法是这个标准中的核心之一。
在制定这个标准时,JPEG专家组开发了两种基本的压缩算法,一种是采用以离散余弦变换(Discrete Cosine Transform)为基础的有损压缩算法。
另一种是采用以预测技术为基础的无损压缩算法。
JPEG通常采用有损压缩,它利用了人的视角系统的特性,使用量化和无损压缩编码相结合来去掉视角的冗余信息和数据本身的冗余信息。
使用有损压缩算法时,在压缩比为25:1的情况下,压缩后还原得到的图像与原始图像相比较,非图像专家难于找出它们之间的区别,因此得到了广泛的应用。
JPEG的压缩编码过程大致分成三个步骤:1、使用正向离散余弦变换把空间域表示的图变换成频率域表示的图;2、使用加权函数对DCT系数进行量化,这个加权函数对于人的视觉系统是最佳的;3、使用霍夫曼可变字长编码器对量化系数进行编码。
下面依次介绍压缩过程中应用到的技术。
一、离散余弦变换离散余弦变换是压缩编码的基础。
在JPEG中,首先将图像分割成8x8像素的小块,然后进行余弦变换,其变换式为(M=N=8):对于每个8×8二维原图像采样数据块, 64点阵的离散函数FDCT把它们作为输入信号,然后分解成64个正交基信号,每个正交基信号对应于64个二维空间频率中的一个,这些空间频率是由输入信号的频谱组成。
图像编码是一种通过使用特定的算法将图像数据转换为二进制码流的过程。
编码标准与规范对于实现高效的图像压缩和解码至关重要。
本文将对几种主要的图像编码标准与规范进行解析。
一、JPEG编码标准JPEG(Joint Photographic Experts Group)是一种广泛应用于静态图像压缩的编码标准。
该标准使用离散余弦变换(DCT)和量化技术对图像进行压缩。
首先,将原始图像划分为不重叠的8x8像素块,每个块经过DCT变换得到频域系数。
然后,通过量化表对频域系数进行量化操作,将高频部分去除。
最后,使用熵编码(如霍夫曼编码)将量化系数编码为二进制码流。
JPEG编码标准在保持图像质量的同时,实现了很高的压缩比。
二、JPEG2000编码标准JPEG2000是一种新一代的图像编码标准,相对于JPEG编码具有更好的压缩效率和更高的图像质量。
JPEG2000采用波特基函数作为变换基函数,利用小波变换将图像从时域转换到频域。
与JPEG不同的是,JPEG2000允许对不同频率的系数采用不同的量化步长,从而更加灵活地控制压缩质量。
此外,JPEG2000还使用了基于小波系数的区域自适应编码(ROI coding)和可伸缩编码(scalable coding)技术,使得编码结果在不同分辨率和质量需求下都能得到满足。
三、编码标准是一种广泛应用于视频编码的标准。
与JPEG和JPEG2000编码不同,编码标准考虑到了视频中帧与帧之间的相关性。
采用了运动估计和运动补偿技术,通过寻找相邻帧之间的运动矢量,将图像中的运动部分与静态部分分开进行编码。
此外,还引入了新的预测模式和变换方法,如帧内预测、变换和量化等,以提高编码效率。
编码标准在保证视频质量的同时,实现了更高的压缩比。
四、WebP编码规范WebP是一种由Google开发的图像编码规范,旨在替代JPEG和PNG格式,提供更高的压缩效率和更好的图像质量。
WebP采用了无损和有损两种压缩模式。
jpeg编码流程
JPEG(Joint Photographic Experts Group)是一种常见的图像压缩标准,下面是JPEG编码的流程:
1. 图片预处理:对原始图像进行一些预处理操作,如颜色空间转换(RGB转YCbCr),图像采样和分辨率调整等。
2. 分块和变换:将图片分为若干个8x8的块,并对每个块进行离散余弦变换(DCT)。
3. 量化:对DCT变换后的结果进行量化操作,将高频部分的系数舍弃或减小,以降低图像的数据量。
4. 颜色空间压缩:对量化后的Y、Cb、Cr三个分量进行独立的色彩空间压缩处理,通常使用基于哈夫曼编码的方法。
5. 编码:对压缩后的数据进行编码处理,包括使用游程长度编码(Run Length Coding)对连续的零系数进行编码,以及使用霍夫曼编码对非零系数进行编码。
6. 生成压缩数据:将编码后的数据按照一定的格式组织起来,生成最终的JPEG压缩数据。
JPEG编码是一种有损压缩方法,通过对图像进行降低色彩精度、舍弃部分细节信息和压缩系数进行量化等操作,以减小图像的数据量,并通过对DCT系数进行进一步的编码压缩,从
而实现图像数据的压缩和存储。
在解码过程中,需要对压缩数据进行相应的解码和逆操作,来还原原始图像的视觉信息。
JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写。
它由国际电话与电报咨询委员会CCITT(The International Telegraph and Telephone Consultative Committee)与国际标准化组织ISO于1986年联合成立的一个小组,负责制定静态数字图像的编码标准。
小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的数字图像压缩编码方法,即JPEG算法。
JPEG算法被确定为国际通用标准,其适用范围广泛,除用于静态图像编码外,还推广到电视图像序列的帧内图像压缩。
而用JPEG算法压缩出来的静态图片文件称为JPEG文件,扩展名通常为*.jpg、*.jpe*.jpeg。
JPEG专家组开发了两种基本的压缩算法、两种数据编码方法、四种编码模式。
具体如下:压缩算法:● 有损的离散余弦变换(Discrete Cosine Transform,DCT);● 无损的预测技术压缩。
数据编码方法:● 哈夫曼编码;● 算术编码;编码模式:● 基于DCT顺序模式:编/解码通过一次扫描完成;● 基于DCT递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进;● 无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;● 层次模式:图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息。
在实际应用中,JPEG图像使用的是离散余弦变换、哈夫曼编码、顺序模式。
JPEG压缩编码算法的主要计算步骤如下:(0) 8*8分块。
(1) 正向离散余弦变换(FDCT)。
(2) 量化(quantization)。
(3) Z字形编码(zigzag scan)。
(4) 使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码。
(5) 使用行程长度编码(RLE)对交流系数(AC)进行编码。
(6) 熵编码。
笔者在实践过程中查阅了大量的资料,发现大多数书籍资料和网上资料都是从编码角度分析JPEG的编/解码方式,并且都只是介绍编码过程中的主要方法。
所以,本文从解码角度详细分析JPEG的编/解码过程,并且加入许多笔者实践过程中遇到的问题和解决方法,希望从另一个角度说明问题,以更好帮助读者结合其他资料解决问题。
不过,介绍解码过程之前,首先要了解JPEG文件中数据的存储格式。
一、JPEG文件格式介绍JPEG文件使用的数据存储方式有多种。
最常用的格式称为JPEG文件交换格式(JPEG File Interchange Format,JFIF)。
而JPEG文件大体上可以分成两个部分:标记码(Tag)和压缩数据。
标记码由两个字节构成,其前一个字节是固定值0xFF,后一个字节则根据不同意义有不同数值。
在每个标记码之前还可以添加数目不限的无意义的0xFF填充,也就说连续的多个0xFF可以被理解为一个0xFF,并表示一个标记码的开始。
而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。
常用的标记有SOI、APP0、DQT、SOF0、DHT、DRI、SOS、EOI。
注意,SOI等都是标记的名称。
在文件中,标记码是以标记代码形式出现。
例如SOI的标记代码为0xFFD8,即在JPEG文件中的如果出现数据0xFFD8,则表示此处为一个SOI标记。
本文附录列出一张完整的JPEG定义的标记表,供读者查阅。
这里仅列出几个常用标记的标记代码、占用字节长度和表示的意义。
●SOI,Start of Image,图像开始◆ 标记代码2字节固定值0xFFD8●APP0,Application,应用程序保留标记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位图数据本标记段可以包含图像的一个微缩版本,存为24位的RGB像素。
如果没有微缩图像(这种情况更常见),则字段⑦“缩略图水平像素数目”和字段⑧“缩略图垂直像素数目”的值均为0。
●APPn,Application,应用程序保留标记n,其中n=1~15(任选)◆ 标记代码2字节固定值0xFFE1~0xFFF◆ 包含2个具体字段:①数据长度2字节①~②2个字段的总长度即不包括标记代码,但包括本字段②详细信息数据长度-2字节内容不定例如,Adobe Photoshop生成的JPEG图像中就用了APP1和APP13两个标记段分别存储了一幅图像的副本。
●DQT,Define Quantization Table,定义量化表◆ 标记代码2字节固定值0xFFDB◆ 包含9个具体字段:①数据长度2字节字段①和多个字段②的总长度即不包括标记代码,但包括本字段②量化表数据长度-2字节a)精度及量化表ID 1字节高4位:精度,只有两个可选值0:8位;1:16位低4位:量化表ID,取值范围为0~3b)表项(64×(精度+1))字节例如8位精度的量化表其表项长度为64×(0+1)=64字节本标记段中,字段②可以重复出现,表示多个量化表,但最多只能出现4次。
●SOF0,Start of Frame,帧图像开始◆ 标记代码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,Difine Huffman Table,定义哈夫曼表◆ 标记代码2字节固定值0xFFC4◆ 包含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标记段只有一个哈夫曼表。
●DRI,Define Restart Interval,定义差分编码累计复位的间隔◆ 标记代码2字节固定值0xFFDD◆ 包含2个具体字段:①数据长度2字节固定值0x0004,①~②两个字段的总长度即不包括标记代码,但包括本字段②MCU块的单元中的重新开始间隔2字节设其值为n,则表示每n个MCU块就有一个RSTn标记。
第一个标记是RST0,第二个是RST1等,RST7后再从RST0重复。
如果没有本标记段,或间隔值为0时,就表示不存在重开始间隔和标记RST●SOS,Start of Scan,扫描开始12字节◆ 标记代码2字节固定值0xFFDA◆ 包含2个具体字段:①数据长度2字节①~④两个字段的总长度即不包括标记代码,但包括本字段②颜色分量数1字节应该和SOF中的字段⑤的值相同,即:1:灰度图是;3:YCrCb或YIQ;4:CMYK。
而JFIF中使用YCrCb,故这里颜色分量数恒为3③颜色分量信息a) 颜色分量ID 1字节b) 直流/交流系数表号1字节高4位:直流分量使用的哈夫曼树编号低4位:交流分量使用的哈夫曼树编号④压缩图像数据a)谱选择开始1字节固定值0x00b)谱选择结束1字节固定值0x3Fc)谱选择1字节在基本JPEG中总为00本标记段中,字段③应该重复出现,有多少个颜色分量(字段②),就出现多少次(一般为3次)。
本段结束后,紧接着就是真正的图像信息了。
图像信息直至遇到一个标记代码就自动结束,一般就是以EOI标记表示结束。
●EOI,End of Image,图像结束2字节◆ 标记代码2字节固定值0xFFD9这里补充说明一下,由于在JPEG文件中0xFF具有标志性的意思,所以在压缩数据流(真正的图像信息)中出现0xFF,就需要作特别处理。
具体方法是,在数据0xFF后添加一个没有意义的0x00。
换句话说,如果在图像数据流中遇到0xFF,应该检测其紧接着的字符,如果是1)0x00,则表示0xFF是图像流的组成部分,需要进行译码;2)0xD9,则与0xFF组成标记EOI,则图像流结束,同时图像文件结束;3)0xD0~0xD7,则组成RSTn标记,则要忽视整个RSTn标记,即不对当前0xFF和紧接的0xDn两个字节进行译码,并按RST标记的规则调整译码变量;3)0xFF,则忽视当前0xFF,对后一个0xFF再作判断;4)其他数值,则忽视当前0xFF,并保留紧接的此数值用于译码。
二、JPEG解码过程详解下面来详细讲述JPEG文件的解码过程。
1.读入文件的相关信息按照上述的JPEG文件数据存储方式,把要解码的文件的相关信息一一读出,为接下来的解码工作做好准备。
参考方法是,设计一系列的结构体对应各个标记,并存储标记内表示的信息。
其中图像长宽、多个量化表和哈夫曼表、水平/垂直采样因子等多项信息比较重要。
以下给出读取过程中的两个问题。
1)整个文件的大体结构JFIF格式的JPEG文件(*.jpg)的一般顺序为:SOI(0xFFD8)APP0(0xFFE0)[APPn(0xFFEn)]可选DQT(0xFFDB)SOF0(0xFFC0)DHT(0xFFC4)SOS(0xFFDA)压缩数据EOI(0xFFD9)2)字的高低位问题JPEG文件格式中,一个字(16位)的存储使用的是Motorola 格式, 而不是Intel 格式。