jpeg编解码过程详解海王博客园
实验4JPEG压缩编解码的实现
实验4JPEG压缩编解码的实现实验四JPEG压缩编解码的实现实验目的:使学生掌握DIB文件和JPEG文件的读写过程,能够在程序中打开DIB文件或JPEG文件,可以进行DIB文件和JPEG文件之间的格式转换。
实验环境:具有多媒体处理功能的计算安装有Windows操作系统,安装有Visual c++6.0程序设计软件。
实验要求:学习相关理论指导,掌握相关程序设计知识;按照实验步骤要求完成程序设计任务,书写实验报告,试验报告中要求包含程序实现的主要程序代码。
实验内容和实验步骤:1)创建基于单文档的应用程序:RWJpegExp,并支持窗口滚动2)为项目添加CJpeg类和jpeglib2库文件3)通过“Project/Settings…”菜单,选中Link选项卡如下设置:4)利用ClassWaizard重载CwinApp的OnFileOpen()函数。
void CRWJpegExpApp::OnFileOpen(){// TODO: Add your command handler code hereCString szOpenFilter = "图象文件|*.bmp; *.dib; *.jpg; *.jpe; *.jpeg; |位图文件(*.bmp;*.dib)|*.bmp; *.dib|JPEG文件(*.jpg;*.jpe;*.jpeg)|*.jpg; *.jpe; *.jpeg|All Files (*.*)|*.*||";CFileDialog FileDlg(TRUE, "*.bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szOpenFilter);if (FileDlg.DoModal() == IDOK)OpenDocumentFile(FileDlg.m_ofn.lpstrFile);}5)利用ClassWaizard重载CRWJpegExpDoc类的的OnOpenDocument()函数。
jpeg 编码原理
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编码原理JPEG是一种常用的图像压缩格式,它可以将图像压缩至原始大小的1/10或更小,而且不会影响图像的质量。
JPEG编码原理是基于离散余弦变换(DCT)和量化技术。
1. 离散余弦变换(DCT)在JPEG编码中,图像被分成8x8个像素块,每个块都被视为一个矩阵。
通过对这些矩阵进行离散余弦变换(DCT),可以将每个块转换为一组频率系数。
离散余弦变换是一种将时域信号转换为频域信号的方法。
在JPEG中,每个块都被视为一个时域信号,并通过离散余弦变换将其转换为频域信号。
这些频率系数表示了该块中各种不同频率的分量。
2. 量化在经过DCT后,得到了每个块的频率系数。
但是由于人眼对于高频细节的感知能力较差,因此在JPEG编码中采用了量化技术来减少高频分量化就是将每个频率系数除以一个固定值,并四舍五入取整。
由于高频分量较大,因此它们被量化后会变得更小,从而减少了数据量。
3. 压缩在经过DCT和量化后,每个块都被转换为一组频率系数,并且高频分量已经被减少。
这些频率系数可以被进一步压缩,从而减少文件大小。
JPEG编码使用了霍夫曼编码技术来压缩这些频率系数。
霍夫曼编码是一种无损压缩技术,它可以将出现频率较高的符号用较短的编码表示,从而减少数据量。
4. 解压在解压JPEG图像时,首先需要将霍夫曼编码还原为频率系数。
然后对这些频率系数进行逆量化和逆离散余弦变换(IDCT),从而恢复原始图像。
逆量化是将每个频率系数乘以一个固定值,并四舍五入取整。
逆离散余弦变换是将每个块的频率系数转换回时域信号,从而恢复原始图像。
JPEG编码原理是基于离散余弦变换和量化技术的。
通过DCT将图像分解为一组频率系数,并采用量化技术减少高频分量,然后使用霍夫曼编码压缩这些频率系数。
在解压时,需要将霍夫曼编码还原为频率系数,并进行逆量化和逆离散余弦变换来恢复原始图像。
JPEG文件编码介绍
JPEG 文件编码简介1.色彩模型变换JPEG的图片使用的是 YCrCb 颜色模型,而不是计算机上最常用的RGB.关于色彩模型,这里不多阐述.只是说明,YCrCb 模型更适合图形压缩.因为人眼对图片上的亮度Y的变化远比色度C的变化敏感.我们完全可以每个点保存一个8bit 的亮度值,每2x2个点保存一个CrCb值,而图像在肉眼中的感觉不会起太大的变化. 所以,原来用RGB模型,4个点需要4x3=12字节.而现在仅需要4+2=6字节;平均每个点占12bit.当然 JPEG 格式里允许每个点的C值都记录下来; 不过MPEG 里都是按 12bit一个点来存放的,我们简写为YUV12.[R G B] -> [Y Cb Cr] 转换-------------------------(R,G,B 都是 8bit unsigned)| Y | | 0.299 0.587 0.114 | | R | | 0 | | Cb | = |- 0.1687 - 0.3313 0.5 | * | G | + |128| | Cr | | 0.5 - 0.4187 - 0.0813| | B | |128|Y = 0.299*R + 0.587*G + 0.114*BCb = - 0.1687*R - 0.3313*G + 0.5 *B + 128Cr = 0.5 *R - 0.4187*G - 0.0813*B + 128[Y,Cb,Cr] -> [R,G,B] 转换-------------------------R = Y + 1.402 *(Cr-128)G = Y - 0.34414*(Cb-128) - 0.71414*(Cr-128)B = Y + 1.772 *(Cb-128)一般,C值(包括 Cb Cr) 应该是一个有符号的数字, 但这里被处理过了, 方法是加上了128. JPEG里的数据都是无符号8bit的.2. DCT (离散余弦变换)JPEG里,要对数据压缩,先要做一次DCT变换.DCT变换的原理,涉及到数学知识,这里我们不必深究.反正和傅立叶变换是差不多了.经过这个变换,就把图片里点和点间的规律呈现出来了,更方便压缩.JPEG 里是对每 8x8 个点为一个单位处理的.所以如果原始图片的长宽不是 8 的倍数, 都需要先补成 8 的倍数, 好一块块的处理. 另外, 记得刚才我说的CrCb都是2x2记录一次吗? 所以大多数情况,是要补成 16x16 的整数块.按从左到右,从上到下的次序排列 (和我们写字的次序一样). JPEG 里是对YCrCb分别做DCT变换的.这里进行DCT 变换的Y,Cr,Cb 值的范围都是 -128~127(Y 被减去 128).JPEG编码时使用的是Forward DCT(FDCT),解码时使用的Inverse DCT(IDCT) 下面给出公式:FDCT:7 7 2*x+1 2*y+1F(u,v) = alpha(u)*alpha(v)* sum sum f(x,y) * cos (------- *u*PI)* cos (------ *v*PI)x=0 y=0 16 16u,v = 0,1,...,7{ 1/sqrt(8) (u==0)alpha(u) = {{ 1/2 (u!=0)IDCT:7 7 2*x+1 2*y+1f(x,y) = sum sum alpha(u)*alpha(v)*F(u,v)*cos (------- *u*PI)* cos (------ *v*PI)u=0 v=0 16 16x,y=0,1 (7)这个步骤很花时间, 另外有种 AA&N 优化算法, 大家可以去网上自己找一下. 在 Intel 主页上可以找到 AA&N IDCT 的 MMX 优化代码. ( Intel 主页上的代码,输入数据为 12.4 的定点数, 输入矩阵需要转置 90 度)3. 重排列DCT结果DCT将一个8x8 的数组变换成另一个8x8 的数组. 但是内存里所有数据都是线形存放的,如果我们一行行的存放这64个数字,每行的结尾的点和下行开始的点就没有什么关系, 所以 JPEG 规定按如下次序整理64个数字.0, 1, 5, 6,14,15,27,28,2, 4, 7,13,16,26,29,42,3, 8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63这样数列里的相邻点在图片上也是相邻的了.4. 量化对于前面得到的 64 个空间频率振幅值, 我们将对它们作幅度分层量化操作.方法就是分别除以量化表里对应值并四舍五入.for (i = 0 ; i<=63; i++ )vector[i] = (int) (vector[i] / quantization_table[i] + 0.5)下面有张 JPEG 标准量化表. (按上面同样的弯曲次序排列)16 11 10 16 24 40 51 6112 12 14 19 26 58 60 5514 13 16 24 40 57 69 5614 17 22 29 51 87 80 6218 22 37 56 68 109 103 7724 35 55 64 81 104 113 9249 64 78 87 103 121 120 10172 92 95 98 112 100 103 99这张表依据心理视觉阀制作, 对 8bit 的亮度和色度的图像的处理效果不错.当然我们可以使用任意的量化表. 量化表是定义在 jpeg 的 DQT 标记后. 一般为 Y 值定义一个, 为 C 值定义一个.量化表是控制 JPEG 压缩比的关键. 这个步骤除掉了一些高频量, 损失了很高细节. 但事实上人眼对高空间频率远没有低频敏感.所以处理后的视觉损失很小.另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程. 大量的图像信息被包含在低空间频率中. 经过量化处理后, 在高空间频率段, 将出现大量连续的零.注意, 量化后的数据有可能超过 2 byte 有符号整数的处理范围.5. 0 RLE 编码现在我们矢量中有许多连续的 0. 我们可以使用 RLE 来压缩掉这些 0. 这里我们将跳过第一个矢量 (后面将解释为什么) 因为它的编码比较特别. 假设有一组矢量(64个的后63个) 是57,45,0,0,0,0,23,0,-30,-16,0,0,1,0,0,0, 0 , 0 ,0 , 0,..,0经过 RLE 压缩后就是(0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-16) ; (2,1) ; EOBEOB 是一个结束标记, 表示后面都是 0 了. 实际上, 我们用 (0,0) 表示 EOB 但是, 如果这组数字不以 0 结束, 那么就不需要 EOB.由于后面 Huffman 编码的要求, 每组数字前一个表示 0 的数量的必须是4 bit,就是说, 只能是 0~15, 所以我们实际这样编码:(0,57) ; (15,0) (2,3) ; (4,2) ; (15,0) (15,0) (1,895) , (0,0)注意 (15,0) 表示了 16 个连续的 0.6. Huffman 编码为了提高储存效率, JPEG 里并不直接保存数值, 而是将数值按位数分成16 组:数值组实际保存值0 0 --1,1 1 0,1-3,-2,2,3 2 00,01,10,11-7,-6,-5,-4,4,5,6,7 3 000,001,010,011,100,101,110,111 -15,..,-8,8,..,15 4 0000,..,0111,1000,..,1111-31,..,-16,16,..,31 5 00000,..,01111,10000,..,11111 -63,..,-32,32,..,63 6 .-127,..,-64,64,..,127 7 .-255,..,-128,128,..,255 8 .-511,..,-256,256,..,511 9 .-1023,..,-512,512,..,1023 10 .-2047,..,-1024,1024,..,2047 11 .-4095,..,-2048,2048,..,4095 12 .-8191,..,-4096,4096,..,8191 13 .-16383,..,-8192,8192,..,16383 14 .-32767,..,-16384,16384,..,32767 15 .还是来看前面的例子:(0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-8) ; (2,1) ; (0,0)只处理每对数右边的那个:57 是第 6 组的, 实际保存值为 111001 , 所以被编码为 (6,111001)45 , 同样的操作, 编码为 (6,101101)23 -> (5,10111)-30 -> (5,00001)-8 -> (4,0111)1 -> (1,1)前面的那串数字就变成了:(0,6), 111001 ; (0,6), 101101 ; (4,5), 10111; (1,5), 00001; (0,4) , 0111 ; (2,1), 1 ; (0,0)括号里的数值正好合成一个字节. 后面被编码的数字表示范围是 -32767..32767.合成的字节里, 高 4 位是前续 0 的个数, 低 4 位描述了后面数字的位数.继续刚才的例子, 如果 06 的Huffman 编码为 11100069 = (4,5) --- 1111111110011001 ( 注: 69=4*16+5 ) 21 = (1,5) --- 111111101104 = (0,4) --- 101133 = (2,1) --- 110110 = EOB = (0,0) --- 1010那么最后对于前面的例子表示的 63 个系数 (记得我们将第一个跳过了吗?) 按位流写入 JPG 文件中就是这样的:111000 111001 111000 101101 1111111110011001 10111 11111110110 000011011 0111 11011 1 1010DC 的编码---------记得刚才我们跳过了每组 64 个数据的第一个吧, DC 就是指的这个数字 (后面63 个简称 AC) 代入前面的 FDCT 公式可以得到c(0,0) 7 7DC = F(0,0) = --------- * sum sum f(x,y) * cos 0 * cos 0 其中 c(0,0) = 1/24 x=0 y=01 7 7= --- * sum sum f(x,y)8 x=0 y=0即一块图像样本的平均值. 就是说, 它包含了原始 8x8 图像块里的很多能量. (通常会得到一个很大的数值)JPEG 的作者指出连续块的 DC 率之间有很紧密的联系,因此他们决定对8x8 块的DC 值的差别进行编码. (Y, Cb, Cr 分别有自己的 DC)Diff = DC(i) - DC(i-1)所以这一块的 DC(i) 就是: DC(i) = DC(i-1) + DiffJPG 从 0 开始对 DC 编码, 所以 DC(0)=0. 然后再将当前 Diff 值加在上一个值上得到当前值.下面再来看看上面那个例子: (记住我们保存的 DC 是和上一块 DC 的差值Diff)例如上面例子中, Diff 是 -511, 就编码成(9, 000000000)如果 9 的 Huffman 编码是 1111110 (在 JPG 文件中, 一般有两个 Huffman 表, 一个是 DC 用, 一个是 AC 用) 那么在 JPG 文件中, DC 的 2 进制表示为1111110 000000000它将放在 63 个 AC 的前面, 上面上个例子的最终 BIT 流如下:1111110 000000000 111000 111001 111000 101101 1111111110011001 10111 11111110110 00001 1011 0111 11011 1 1010下面简单叙述一下针对一个数据单元的图片 Y 的解码-----------------------------------------------在整个图片解码的开始, 你需要先初始化 DC 值为 0.1) 先解码 DC:a) 取得一个 Huffman 码 (使用 Huffman DC 表)b) Huffman解码, 看看后面的数据位数 Nc) 取得 N 位, 计算 Diff 值d) DC + = Diffe) 写入 DC 值: " vector[0]=DC "2) 解码 63 个 AC:------- 循环处理每个 AC 直到 EOB(最多63 个 AC)a) 取得一个 Huffman 码 (使用 Huffman AC 表)b) Huffman 解码, 得到 (前面 0 数量, 组号) [记住: 如果是(0,0) 就是 EOB 了]c) 取得 N 位(组号) 计算 ACd) 写入相应数量的 0e) 接下来写入 AC-----------------进一步的解码------------上一步我们得到了 64 个矢量. 下面我们还需要做一些解码工作:1) 反量化 64 个矢量 : "for (i=0;i<=63;i++) vector[i]*=quant[i]" (注意防止溢出)2) 重排列 64 个矢量到 8x8 的块中3) 对 8x8 的块作 IDCT对 8x8 块的 (Y,Cb,Cr) 重复上面的操作 [Huffman 解码, 步骤 1), 2), 3)]4) 将所有的 8bit 数加上 1285) 转换 YCbCr 到 RGBJPG 文件(Byte 级)里怎样组织图片信息-----------------------------------注意 JPEG/JFIF 文件格式使用 Motorola 格式, 而不是 Intel 格式, 就是说, 如果是一个字的话, 高字节在前, 低字节在后.JPG 文件是由一个个段 (segments) 构成的. 每个段长度 <=65535. 每个段从一个标记字开始. 标记字都是 0xff 打头的, 以非 0 字节和 0xFF 结束. 例如'FFDA' , 'FFC4', 'FFC0'. 每个标记有它特定意义, 这是由第2字节指明的. 例如, SOS (Start Of Scan = 'FFDA') 指明了你应该开始解码. 另一个标记 DQT (Define Quantization Table = 0xFFDB) 就是说它后面有64 字节的quantization 表在处理 JPG 文件时, 如果你碰到一个 0xFF, 而它后面的字节不是 0, 并且这个字节没有意义. 那么你遇到的 0xFF 字节必须被忽略. (一些 JPG 里, 常用用 0xFF 做某些填充用途) 如果你在做 Huffman 编码时碰巧产生了一个 0xFF, 那么就用 0xFF 0x00 代替. 就是说在 jpeg 图形解码时碰到 FF00 就把它当作FF 处理.另外在 Huffman 编码区域结束时, 碰到几个 bit 没有用的时候, 应该用 1 去填充.然后后面跟 FF.下面是几个重要的标记--------------------SOI = Start Of Image = 'FFD8' 这个标记只在文件开始出现一次EOI = End Of Image = 'FFD9'JPG 文件都以 FFD9 结束RSTi = FFDi ( i = 0..7) [ RST0 = FFD0, RST7=FFD7]= 复位标记通常穿插在数据流里, 我想是担心 JPG 解码出问题吧(应该配合 DRI 使用). RST 将Huffman 的解码数据流复位. DC 也重新从 0 开始计(SOS --- RST0 --- RST1 -- RST2 --......-- RST6 --- RST7 -- RST0 --...)----标记----下面是必须处理的标记SOF0 = Start Of Frame 0 = FFC0SOS = Start Of Scan = FFDAAPP0 = it's the marker used to identify a JPG file which uses the JFIF specification = FFE0COM = Comment = FFFEDNL = Define Number of Lines = FFDCDRI = Define Restart Interval = FFDDDQT = Define Quantization Table = FFDBDHT = Define Huffman Table = FFC4JPG 文件中 Huffman 表的储存---------------------------JPEG 里定义了一张表来描述 Huffman 树. 定义在 DHT 标记后面. 注意: Huffman 代码的长度限制在 16bit 内.一般一个 JPG 文件里会有 2 类 Huffman 表: 一个用于 DC 一个用于 AC (实际有 4个表, 亮度的 DC,AC 两个, 色度的 DC,AC 两个)这张表是这样保存的:1) 16 字节:第 i 字节表示了 i 位长的 Huffman 代码的个数 (i= 1 到 16)2) 这表的长度 (字节数) = 这 16 个数字之和现在你可以想象这张表怎么存放的吧? 对应字节就是对应 Huffman 代码等价数字. 我不多解释, 这需要你先了解 Huffman 算法. 这里只举一个例子:Huffman 表的表头是 0,2,3,1,1,1,0,1,0,0,0,0,0,0,0,0就是说长度为 1 的代码没有长度为 2 的代码为 0001长度为 3 的代码是 100101110长度为 4 的代码是 1110长度为 5 的代码是 11110长度为 6 的代码是 111110长度为 7 的代码没有 (如果有一个的话应该是 1111110)长度为 8 的代码是 11111100.....后面都没有了.如果表下面的数据是45 57 29 17 23 25 34 28就是说45 = 0057 = 0129 = 10017 = 10123 = 110等等...如果你懂 Huffman 编码, 这些不难理解采样系数--------下面讲解的都是真彩 JPG 的解码, 灰度 JPG 的解码很简单, 因为图形中只有亮度信息. 而彩色图形由 (Y, Cr, Cb) 构成, 前面提到过, Y 通常是每点采样一次, 而 Cr,Cb 一般是 2x2 点采样一次, 当然也有的 JPG 是逐点采样, 或者每两点采样 (横向两点, 纵向一点) 采样系数均被定义成对比最高采样系数的相对值.一般情况 (即: Y 逐点采样, Cr Cb 每 2x2 点一次) 下: Y 有最高的采样率, 横向采样系数HY=2 纵向采样系数 VY=2; Cb 的横向采样系数 HCb=1, 纵向采样系数 VCb=1;同样 HCr=1, VCr=1在 Jpeg 里, 8x8 个原始数据, 经过 RLC, Huffman 编码后的一串数据流称为一个 Data Unit (DU). JPG 里按 DU 为单位的编码次序如下:1) for (counter_y=1;counter_y<=VY;counter_y++)for (counter_x=1;counter_x<=HY;counter_x++){ 对 Y 的 Data Unit 编码 }2) for (counter_y=1;counter_y<=VCb ;counter_y++)for (counter_x=1;counter_x<=HCb;counter_x++){ 对 Cb 的 Data Unit 编码 }3) for (counter_y=1;counter_y<=VCr;counter_y++)for (counter_x=1;counter_x<=HCr;counter_x++){ 对 Cr 的 Data Unit 编码 }按我上面的例子: (HY=2, VY=2 ; HCb=VCb =1, HCr,VCr=1) 就是这样一个次序 YDU,YDU,YDU,YDU,CbDU,CrDU这些就描述了一块 16x16 的图形. 16x16 = (Hmax*8 x Vmax*8) 这里 Hmax=HY=2 Vmax=VY=2一个 (Hmax*8,Vmax*8) 的块被称作 MCU (Minimun Coded Unix) 前面例子中一个 MCU = YDU,YDU,YDU,YDU,CbDU,CrDU如果 HY =1, VY=1HCb=1, VCb=1HCr=1, VCr=1这样 (Hmax=1,Vmax=1), MCU 只有 8x8 大, MCU = YDU,CbDU,CrDU对于灰度 JPG, MCU 只有一个 DU (MCU = YDU)JPG 文件里, 图像的每个组成部分的采样系数定义在 SOF0 (FFC0) 标记后简单说一下JPG文件的解码-----------------------解码程序先从 JPG 文件中读出采样系数, 这样就知道了 MCU 的大小, 算出整个图像有几个 MCU. 解码程序再循环逐个对 MCU 解码, 一直到检查到 EOI 标记. 对于每个MCU, 按正规的次序解出每个DU, 然后组合, 转换成 (R,G,B) 就OK 了附:JPEG 文件格式~~~~~~~~~~~~~~~~- 文件头 (2 bytes): $ff, $d8 (SOI) (JPEG 文件标识)- 任意数量的段 , 见后面- 文件结束 (2 bytes): $ff, $d9 (EOI)段的格式:~~~~~~~~~- header (4 bytes):$ff 段标识n 段的类型 (1 byte)sh, sl 该段长度, 包括这两个字节, 但是不包括前面的 $ff 和 n.注意: 长度不是 intel 次序, 而是 Motorola 的, 高字节在前,低字节在后!- 该段的内容, 最多 65533 字节注意:- 有一些无参数的段 (下面那些前面注明星号的)这些段没有长度描述 (而且没有内容), 只有 $ff 和类型字节.- 段之间无论有多少 $ff 都是合法的, 必须被忽略掉.段的类型:~~~~~~~~~*TEM = $01 可以忽略掉SOF0 = $c0 帧开始 (baseline JPEG), 细节附后SOF1 = $c1 ditoSOF2 = $c2 通常不支持SOF3 = $c3 通常不支持SOF5 = $c5 通常不支持SOF6 = $c6 通常不支持SOF7 = $c7 通常不支持SOF9 = $c9 arithmetic 编码(Huffman 的一种扩展算法), 通常不支持 SOF10 = $ca 通常不支持SOF11 = $cb 通常不支持SOF13 = $cd 通常不支持SOF14 = $ce 通常不支持SOF14 = $ce 通常不支持SOF15 = $cf 通常不支持DHT = $c4 定义 Huffman Table, 细节附后JPG = $c8 未定义/保留 (引起解码错误)DAC = $cc 定义 Arithmetic Table, 通常不支持*RST0 = $d0 RSTn 用于 resync, 通常被忽略*RST1 = $d1*RST2 = $d2*RST3 = $d3*RST4 = $d4*RST5 = $d5*RST6 = $d6*RST7 = $d7SOI = $d8 图片开始EOI = $d9 图片结束SOS = $da 扫描行开始, 细节附后DQT = $db 定义 Quantization Table, 细节附后DNL = $dc 通常不支持, 忽略DRI = $dd 定义重新开始间隔, 细节附后DHP = $de 忽略 (跳过)EXP = $df 忽略 (跳过)APP0 = $e0 JFIF APP0 segment marker (细节略)APP15 = $ef 忽略JPG0 = $f0 忽略 (跳过)JPG13 = $fd 忽略 (跳过)COM = $fe 注释, 细节附后其它的段类型都保留必须跳过SOF0: Start Of Frame 0:~~~~~~~~~~~~~~~~~~~~~~~- $ff, $c0 (SOF0)- 长度 (高字节, 低字节), 8+components*3- 数据精度 (1 byte) 每个样本位数, 通常是 8 (大多数软件不支持 12 和16)- 图片高度 (高字节, 低字节), 如果不支持 DNL 就必须 >0- 图片宽度 (高字节, 低字节), 如果不支持 DNL 就必须 >0- components 数量(1 byte), 灰度图是 1, YCbCr/YIQ 彩色图是 3, CMYK 彩色图是 4- 每个 component: 3 bytes- component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q)- 采样系数 (bit 0-3 vert., 4-7 hor.)- quantization table 号DRI: Define Restart Interval:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~- $ff, $dd (DRI)- 长度 (高字节, 低字节), 必须是 4- MCU 块的单元中的重新开始间隔 (高字节, 低字节),意思是说, 每 n 个 MCU 块就有一个 RSTn 标记.第一个标记是 RST0, 然后是 RST1 等, RST7 后再从 RST0 重复DQT: Define Quantization Table:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~- $ff, $db (DQT)- 长度 (高字节, 低字节)- QT 信息 (1 byte):bit 0..3: QT 号(0..3, 否则错误)bit 4..7: QT 精度, 0 = 8 bit, 否则 16 bit- n 字节的 QT, n = 64*(精度+1)备注:- 一个单独的 DQT 段可以包含多个 QT, 每个都有自己的信息字节- 当精度=1 (16 bit), 每个字都是高位在前低位在后DAC: Define Arithmetic Table:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~法律原因, 现在的软件不支持 arithmetic 编码.不能生产使用 arithmetic 编码的 JPEG 文件DHT: Define Huffman Table:~~~~~~~~~~~~~~~~~~~~~~~~~~- $ff, $c4 (DHT)- 长度 (高字节, 低字节)- HT 信息 (1 byte):bit 0..3: HT 号 (0..3, 否则错误)bit 4 : HT 类型, 0 = DC table, 1 = AC tablebit 5..7: 必须是 0- 16 bytes: 长度是 1..16 代码的符号数. 这 16 个数的和应该 <=256- n bytes: 一个包含了按递增次序代码长度排列的符号表(n = 代码总数)备注:- 一个单独的 DHT 段可以包含多个 HT, 每个都有自己的信息字节COM: 注释:~~~~~~~~~~- $ff, $fe (COM)- 注释长度 (高字节, 低字节) = L+2- 注释为长度为 L 的字符流SOS: Start Of Scan:~~~~~~~~~~~~~~~~~~~- $ff, $da (SOS)- 长度 (高字节, 低字节), 必须是 6+2*(扫描行内组件的数量)- 扫描行内组件的数量 (1 byte), 必须 >= 1 , <=4 (否则是错的) 通常是 3 - 每个组件: 2 bytes- component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q), 见 SOF0- 使用的 Huffman 表:- bit 0..3: AC table (0..3)- bit 4..7: DC table (0..3)- 忽略 3 bytes (???)备注:- 图片数据 (一个个扫描行) 紧接着 SOS 段.。
JPEG编码原理概述
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编解码过程详解- 海王- 博客园JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写。
它由国际电话与电报咨询委员会CCITT(The International Telegraph and Telephone Consultative Committee)与国际标准化组织ISO于1986年联合成立的一个小组,负责制定静态数字图像的编码标准。
小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的数字图像压缩编码方法,即JPEG算法。
JPEG算法被确定为国际通用标准,其适用范围广泛,除用于静态图像编码外,还推广到电视图像序列的帧内图像压缩。
而用JPEG算法压缩出来的静态图片文件称为JPEG文件,扩展名通常为*.jpg、*.jpe*.jpeg。
JPEG专家组开发了两种基本的压缩算法、两种数据编码方法、四种编码模式。
具体如下:压缩算法:l 有损的离散余弦变换(Discrete Cosine Transform,DCT);l 无损的预测技术压缩。
数据编码方法:l 哈夫曼编码;l 算术编码;编码模式:l 基于DCT顺序模式:编/解码通过一次扫描完成;l 基于DCT递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进;l 无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;l 层次模式:图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息。
在实际应用中,JPEG图像使用的是离散余弦变换、哈夫曼编码、顺序模式。
JPEG压缩编码算法的主要计算步骤如下:(0) 8*8分块。
(1) 正向离散余弦变换(FDCT)。
(2) 量化(quantization)。
(3) Z字形编码(zigzag scan)。
(4) 使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码。
(5) 使用行程长度编码(RLE)对交流系数(AC)进行编码。
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编码原理摘要: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编解码详解
ᷛޚ∾ᔺ߮˄˅˄˅ !"༘ড়ඈඋϟẟᜐࠊᅮՈᷛޚՈିൟ˄ϝି˅˖! "ᷛޚ˖☦ᷛޚ˖! " ǃᔽ˖☦Ոऩ! "ǃᔽ˖☦Ոᢊ# $ % &$ '&( )& * ( ( + ,, $ ) & ( ( $- (+ ( (.)( + / ( % % ( *( / ( % 0 +( % ( $1 ( $ + % ( $&+ % 2) 3 ( ( ( + +( % $((4ᷛޚẴ᳝ϝय़෭ிඣ˖˄˅ிඣ˖☦᳝ᤳय़෭Ոˈ₋/ य़෭DŽṗ8ԡ//ᄶˈ.ˈ₋Huffman˗˄˅ிඣ˖ЎˈҢDŽṗ12ԡ//ᄶˈ௳ˈ₋Huffmanਜ਼˗˄˅ிඣ˖☦य़෭Ոˈ₋य़෭DŽ ԡ55ᄶˈᑣˈ₋ਜ਼DŽிඣᖙிඣՈDŽᑣ߫ᓣ௳ẟᓣ% ( *( %$ ( ) ( )+ + 6 &((( 6 7 ( * ($ (( (& # ( ) 8 ('& 8%9:Ảනڣय़෭ǃᔽ˄;˅,ǃᔽ˄˅⊩Ոᷛޚ 5 , :ᷛޚ“”े ᷛޚọᅮ</Ոᷛޚ࣪DŽඈඋᴎ༘ড়ඈՈϧඈࠊᅮՈ☝ᷛޚˈᑊՈᷛޚˈজᷛޚDŽՈ☝ᷛޚˈ᮶DŽҟ ⊩/⊩˗ᅗˈҹ25:1˄☢ҹ˅DŽDPCM⊩ˈẝˈₑˈԚ˄൪2:1˅DŽ-+ 7 / %ColorConverterYCbCrR GB8 ×8Image BlockQuantizationTableCoding TableQuantizationEntropy Coding DCTLossless LossySamplingOutput FileHeadData4/य़෭ڣ᭄Ịₓ఼఼࣪8x8ᘶՈڣ఼᭄8x8ڣ᭄ₓ఼఼࣪ڣ఼᭄᠃ءᷧࠫ9᳝ᤳय़෭ՈϝϾℹɘℷࡿᬷԭᓺবᤶForward Discrete CosineTransformˈFDCT)বᤶDŽ DCTˈẝDŽবᄫේۅ఼ේۅDŽ᧱ءᝆลछ֊᠃ࢻҤᷧࠫ̾ࢻശءᷧࠫԘࣽ᧱ءᝆลछ֊᠃ࢻҤᷧࠫ̾ࢻശءᷧࠫԘࣽȢȢ:ReadValues From SRAM And store in a 8x8matrixFDCT QuantizationRun Length EncodingTo SRAM,ਜ਼⊩ϢᔽᄶाⒸ᮴݇˗ ਜ਼⊩໘ᔽᄶڣᰃᔽᄶߚڣ˗ ᔽᄶाⒸՈDŽ !+ " ! &+ %"!.) 3 "य़෭ℹɘ Pᄶবᤶ˄˅˄˅ Eඳবᤶ ḰᤶۅᵘỤᄤڣᇚ:h :Ոᄤഫˈᇍഫऩ/বᤶDŽ8x8Ոϣᗻˈᇚ:h :Ոഫˈᇚ ǃh ՈഫDŽǃՈഫბ 5 Ոֵ:h :ՈڭDŽBlock-based ExampleJInote that white lines are artificially added to the border of each 8-by-8 block to denote that each block is processed independentlypadded regionsExample1213141516171819121314151617181912131415161718191213141516171819When the width/height of an image is not the multiple of 8, the boundary is artificially padded with repeated columns/rows to make them multiple of 84= ->ˈᦤˈᇚ= -ḰᤶЎ>ˈේۅᯊۅ˖> ? ,,= @ :9 @ 4 - ?– 9:9= – @ - @ : ? = – 4 :9 – : - @ :Pᄶᢧۅ˖= ? > @ 4 ! – :" ? > – 44 4! – :" – 9 4 4! – :"- ? > @ 99 ! – :"Ϣ >A B ՈP DŽˈǃDŽḰᤶ݀#2010-3-5LIST264:4:4[Y0(dc), Y0(ac)],[Cb(dc), Cb(ac)], [Cr(dc), Cr(ac)]4:2:2[Y0(dc), Y0(ac)][Y1(dc), Y1(ac)],[Cb(dc), Cb(ac)],[Cr(dc), Cr(ac)]9DCT is like FFT, but can approximate linear signals wellwith few coefficients.:⒲LՈᦤߎ/ ՈₑˈԚՈѠˈᆩ/ˈ݊ՈᯊDŽЎ/Ոਜ਼DŽˈ/Ոᖿ˖ˊD DDŽָD D/ՈᖿDŽĽ⚍ᰃᅲɴּᇍṇᆍᯧˈԚDŽϵ/বᰃᅲ᭄ˈ໐ˈᰒᰃˈгDŽˊᅲ᭄/বᤶDŽᰒˈẝּ↨ˈᩥDŽˈϔᅲɴ/বᤶDŽ,2010-3-5LIST29+==n nu N n n f N u F n f NF π2)12(cos )(2)()(1)0((u=1, …, N-1)()++=u u N x u F N F N n f π212cos )(2)0(1)(1DDCT2DDCT() =xyy x f NF ),(10,0+=x y v N y y x f N v F π212cos ),(2),0(+=x y u N x y x f N u F π212cos ),(2)0,(+ +=ππv N y u Nx y x f N v u F 212cos 212cos ),(2),((u,v = 1, …, N-1)2010-3-5LIST30(0,255)ė(-128, 127)বᤶ DCT বᤶᰃϔᅲ᭄ඳবᤶˈ݊বᤶḌЎᅲ᭄Ոԭ᭄DŽবᤶᅲᯬᰃᇚϔϾඳϞՈֵˈবᤶЎϔϾඳϞՈֵDŽϔᐙˈϔᐙՈᶤ᭄ᄫЎڭAˈᑊA ЎM h Nˈ߭2මDCTবᤶЎ˖বᤶৢՈ/ẟᜐₓ˄ϬᣛՈₓ>AǃBDŽ Ոॳ߭ᰃԢϬᇣՈؐˈʌϬՈؐˈₓՈᇚӮՈDŽ₋ϬⓌЎᄤ᭄ԡ᭄ՈₓDŽ᠔ϬৠϔϾˈԚՈপ᭄ՈԡˈⓌ᭄ՈDŽϬϡՈₓˈᑊᭈDŽ4˅ℷ˖ .)*? ) ! )*5 2)*"݊Ё˖ )*ᰃ/ ˈ2)*˅Ị˖=)*? .)*2)*՟˖.! 8 " ? ) F 4 5 G? ) F ,G ?=)*! 8 " ? H ? 444 4 , : 4 44 9 , 4 9 , :9: : 9 : , 99 4 4: 4 , 4, 49::9 9 ,,,:,,ᜬᜬ9 : 449,,,,,,,,: ,,,,,,,, 4 ,,,,,,,,,,49 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ᜬᜬ92010-3-5LIST37:190190193191191187186185191192196192193189187185189191194192193191190190191190193194191189191189194192191192192189184182192194194191186182180178192195191186182175170169195195190188181176166173−−−−−−−−−−−−−002031121100213212112114211321211111113211312013144032122422112131034480-128+DCTQuantization Table−−−−−−00000000000000000000000000000000000000000000001100000022000001330,П & %ᮍ / ; !/ ( ( + )+ ( ( ; )+ "→/( ( =0 !=) 0( % $ %"→< ( (ඓϞẴϸේۅᮍᓣ໘ˊৢՈ/ ( (1) %ᮍᓣේۅDŽ/ 1) %< 1)%4111001110100000110011101111݇է012345670.050.050.100.150.250.200.150.050.100.150.250.300.450.551.0011011001011Huffman Encoding44 2010-3-5LIST 42DC (Y, C b , C r ): difference encoding / / // / 4// / 9/ :Diff k = DC k –DC k-1/ / / / / 4/ / / 9/ :4 2010-3-5LIST 43( SIZE, AMPLITUDE )4444 / / ? →- +( % $ ? → (6 ? →ṗߎ! (6 8 / / " ? ! 8 "ˈ! "ˈ/ /ؐDŽ49< ᭄ഛЎ< Ոय़Ϭ=) 0( % $ %ẟᜐ=0 Пࠡˈ /ܜᇚ/ϔම᭄ඈЁˈ݊₋ϬI % I % →ܜᝯᠿᦣࠄՈ<ৢՈ/ ϔමৢˈݡᇚϔՈ< =0Zig-Zag Scan4:6 ( (=) #/ϔමߎɴ► 0(*(+#᪩☢ ඓ=0 Ո/ ҹ!=) 8 0(*(+"→!=8 0" →B +( 0( % $ ( !B 0 "Ͼ!=8 0" =) 0( % $ % Ո(R, L)= (0, -3), (0, -2), (0, -1), (0, -2), (0, -1), (2, -1)(EOB)4,Ởᐌ=0 Ё= ˈԚ0J =8 0K →J =8 0 +( % $K J 0K J 0 +( % $K’ &+( ( ৢ᠔Ոԡ J 0K ’ &+( ( ৢՈDŽ=?L L L L M 0? M ' &+(# !=8 0"? ! 8 "8 ! 8 "8 ! 8 "8 ! 8 "8 ! 8 "8 ! 8 "! -" !=8 0 +( % $"!0" ? ! 8 "! " ! 8 "! " ! 8 "! " ! 8 "! " ! 8 "! " ! 8 "! " ! -"< 1)Length of L +( <ி᭄Ոሒۅԡ᭄ᜬ。
JPEG文件解码详解
JPEG文件解码详解JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写。
它由国际电话与电报咨询委员会CCITT(The International Telegraph and Telep hone 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)进行编码。
jpeg编码流程
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编码解码流程
JPEG 图片压缩算法流程详解薛晓利JPEG 是Joi nt Photogra phic Exports Group 的英文缩写,中文称之为联合图像专家小组。
该小组隶属于ISO 国际标准化组织,主要负责定制静态数字图像的编码方法, 即所谓的JPEG算法。
JPEG 专家组开发了两种基本的压缩算法、两种熵编码方法、四种编码模式。
如下所示:压缩算法:(1) 有损的离散余弦变换 DCT ( Discrete Cosine Transform ) (2) 无损的预测压缩技术; 熵编码方法:(1) Huffman 编码; (2) 算术编码; 编码模式:(1) (2)递增;(3) (4)11个步骤:颜色模式转换、采样、分块、离 DC 系数的差分脉冲调制编码、 DC 系数的系数的中间格式计算、熵编码。
下面,将一(1)颜色模式转换JPEG 采用的是YCrCb 颜色空间,而 进行压缩,首先需要进行颜色空间的转换。
色度和饱和度(也有人将Cb,Cr 两者统称为色度),三者通常以 Y,U,V 来表示,即用 U 代表 Cb ,用V 代表Cr 。
RGB 和YCrCb 之间的转换关系如下所基于DCT 的顺序模式:编码、解码通过一次扫描完成;基于DCT 的渐进模式:编码、解码需要多次扫描完成,扫描效果由粗到精, 逐级无损模式:基于 DPCM ,保证解码后完全精确恢复到原图像采样值; 层次模式:图像在多个空间分辨率中进行编码,可以根据需要只对低分辨率数据 做解码,放弃高分辨率信息;在实际应用中,JPEG 图像编码算法使用的大多是离散余弦变换、 Huffman 编码、顺序编码模式。
这样的方式,被人们称为JPEG 的基本系统。
这里介绍的JPEG 编码算法的流程, 也是针对基本系统而言。
基本系统的JPEG 压缩编码算法一共分为 散余弦变换(DCT )、Zigzag 扫描排序、量化、 中间格式计算、AC 系数的游程长度编码、 一介绍这11个步骤的详细原理和计算过程。
JPEG图像压缩与编码解析
2018年10月18日
JPEG图像压缩与编码
2 JPEG算法的主要计算步骤
二维DCT的计算 二维图像块的DCT可以理解为先对图像块的每一行 进行一维DCT,然后对经行变换的块的每列再应用 一维DCT。 当计算精度足够高时,DCT变换不会损失图像质量
X
f (i, j )
垂直方向 8× 1 DCT
2018年10月18日
JPEG图像压缩与编码
1 背景介绍
色彩空间变换和数据的压缩并没有直接的关系。而是 涉及到图像采样的问题。 采样依据:人的眼睛含有对亮度敏感的柱状细胞1.8亿 个,含有对色彩敏感的椎状细胞0.08亿个,由于柱状细 胞的数量远大于椎状细胞,所以眼睛对亮度的敏感程 度要大于对色彩的敏感程度。
SSSS为表示差值所需的位数,DIFF为表示起始值所需的位数
位数 s 可以表示的范围 【-2s+1,-2s-1】,【 2s-1 , 2s-1 】 0位和1位单独
3、符号编码
位数SSSS的霍夫曼编码查表 幅度DIFF用补码表示,正数时最高有效位为1,负数时最高有 效位为0
2)AC系数
1、生成中间符号 (RRRRSSSS,AC幅度值) RRRR表示0的行程长度,SSSS表示AC值所需的位数 RRRRSSSS用 R/S 表示
一是无损压缩:将相同的或相似的数据或特征归类,使用较少的 数据描述原始数据,从而减少数据量。如RLE编码,Huffman编 码和算术编码。 二是有损压缩:有针对性的简化不重要的数据,以减少总的数据 量。只要损失的数据不会影响人眼主管接收的效果就可以采用这 种压缩。如预测编码和变换编码。
1 背景介绍
JPEG图像压缩与编码
2 JPEG算法的主要计算步骤
jpeg硬件解码原理-概述说明以及解释
jpeg硬件解码原理-概述说明以及解释1.引言1.1 概述概述部分主要介绍有关JPEG硬件解码原理的背景和概念。
JPEG是一种广泛用于图像压缩的标准,其硬件解码原理指的是通过硬件电路实现对JPEG压缩图像的解码操作。
在数字图像处理中,JPEG算法是一种有损压缩算法,能够将图像文件的大小大幅减小并保持较高的图像质量。
JPEG算法通过对图像中的冗余信息进行剔除和量化处理来实现压缩。
然后,压缩后的图像通过JPEG解码器进行解码,以便在显示设备上进行显示或进一步处理。
与软件解码相比,硬件解码具有更快的解码速度和更低的功耗。
JPEG 硬件解码器通常由多个专门设计的硬件模块组成,这些模块相互协作以完成解码过程。
硬件解码器可以通过并行处理和高效的数据传输来加快解码速度,并且能够在嵌入式设备和低功耗应用中实现高质量的图像显示。
本文将详细介绍JPEG图像压缩算法以及JPEG硬件解码原理。
同时,还将探讨JPEG解码器的结构和功能,以及采用硬件解码的优势和应用场景。
在接下来的章节中,我们将逐步深入探讨这些内容,以加深对JPEG 硬件解码原理的理解。
同时,我们也将对未来的发展进行一些展望,希望能够为读者提供更多有关JPEG硬件解码的信息。
最后,文章将总结已探讨的内容,并给出一些结束语。
本文的目的是帮助读者理解JPEG硬件解码原理,为其在相关领域的研究和应用提供指导和参考。
无论是对于学术研究者还是工程师来说,了解JPEG硬件解码原理都具有重要的意义。
通过深入了解JPEG硬件解码原理,可以更好地应用和优化JPEG解码器,从而提升图像处理的效率和质量。
1.2 文章结构文章结构部分的内容如下:文章结构部分旨在介绍整篇文章的结构和内容安排,为读者提供一个概览,使其对文章的组织和发展有清晰的了解。
本文分为引言、正文和结论三个部分。
引言部分将首先概述本文的主题JPEG硬件解码原理,并介绍文章的结构和内容安排。
正文部分将主要包含三个小节。
JPEG压缩编码算法的主要计算步骤如下正向离散余弦变换-Read
三:综上所述,我们可用中间码的形式表示前面所举8*8样本子块:
(2)(2),(1/2)(-2),(0/1)(-1),(0/1)(-1),(0/1)(-1),(2/1)(-1),(0/0) 利用JPEG提供的HUFFMAN表,可得到最后的熵编码的输出序列为:
Delta=DC(0, 0)k-DC(0, 0)k-1
5. 交流系数的编码
量化AC系数的特点是1*64矢量中包含有许多“0”系数,并且许 多“0”是连续的,因此使用非常简单和直观的游程长度编码(RLE) 对它们进行编码。
6. 熵编码
使用熵编码还可以对DPCM编码后的直流DC系数和RLE编码后的交 流AC系数作进一步的压缩。
2:用分组大小查亮度或色度DC系数Huffman表,得该分组的编码为011。 3:在分组的编码为011的后面附加上DC系数2的补码(10),得DC系数的输出编 码为01110。 二、AC系数的编码 1:对AC系数进行“Z”字排序,得:0-2-1-100-1000…000 2:第一个非零值为-2,查表得分组大小为2,其前面的零的个数为1,即行程长度 为1,于是中间码的前半部分为1/2;而后半部分为-2的补码表示10。 3:再由中间码的前半部分为1/2查JPEG提供的亮度或色度AC系数HUFFMAN表,得 此系使用下式计算,
上面两式中, C(u), C(v) = 1/, 当u, v = 0; C(u), C(v) = 1, 其他。 f(i, j)经DCT变换之后,F(0,0)是直流系数,其他为交流系数。 (3) 在计算两维的DCT变换时,可使用下面的计算式把两维的DCT变 换变成一维的DCT变换,
5. 使用行程长度编码(run-length encoding,RLE)对交流 系数(AC)进行编码。
jpeg编码
作为一个基本的图像压缩方式,JPEG 已经得到了广泛的运用,但 JPEG 相关的基本原理,却经常被忽视,或解释得很不确切。
这里我们详细讨论一下 JPEG 的编码原理,并结合实例来给出一个更加感性的认识。
JPEG 编码的详细过程有着诸多的信息可以给我们巨大的启发,我们在这里讨论的就是要对这些信息做一个具体细致的分析,通过我们的讨论,大家会对 JPEG 编码过程中出现的内容有一个确切的了解,并且能了解到这些内容的来龙去脉。
一、系统架构本文以一个实际的产品为例,来说明 JPEG 在其中的应用。
本系统为一个嵌入式 Linux 网络播放器,主要的功能为播放家庭网络中的多媒体文件,在家庭客厅等环境中有着大量的应用,它可以给用户提供更方便快捷的媒体文件的播放方式,并能充分利用家庭音响系统的巨大功能,而非 PC 环境下有限的外部设备,大大改善了媒体文件的播放体验。
系统主要的功能包括:本系统架构如下图:本系统是基于嵌入式 Linux 的一个应用,使用的是 ucLinux 2.4.22,并使用了microwindows 作为 GUI 界面,底层使用了 Linux kernel 的 FrameBuffer 作为显示输出。
此系统在两个方面使用到了 JPEG 库:1、 UI 的显示,即各种人机交互界面,考虑到用户体验,所以大量使用了贴图来美化 UI2、 JPEG 图片文件的全屏播放,包括用户手中的各种照片等二、JPEG 概述JPEG 是 Joint Photographic Experts Group 的缩写,即 ISO 和 IEC 联合图像专家组,负责静态图像压缩标准的制定,这个专家组开发的算法就被称为 JPEG 算法,并且已经成为了大家通用的标准,即 JPEG 标准。
JPEG 压缩是有损压缩,但这个损失的部分是人的视觉不容易察觉到的部分,它充分利用了人眼对计算机色彩中的高频信息部分不敏感的特点,来大大节省了需要处理的数据信息。
jpeg计算过程
JPEG算法举例某亮度子块的编码,Z序排列后如下K 0 1 2 3 4 5 6 7 8 9-30 31 32-63系数12 5 -2 0 2 0 0 0 1 0 -1 0按JPEG基本系统编码给出该子块的编码.求解:zz(k)=DC,AC01……AC07……AC63(1) 对DC系数12,查找(P68页)表5-5 DC差值范围落入(-15..-8,8..15),得SSSS为4;中间符号为(4,12)查(P68页)表5-6亮度DC差值码表查找4 霍弗曼编码得101;因为12为正数,所以4位附加位直接用12的二进制码1100所以得到ZZ(0) 编码1011100(2). 对AC系数ZZ(1)=5,查找(P69页)表5-10 AC差值范围落入(-7…-4,4…7)得SSSS为3;因为与ZZ(0)间无0个数,所以RRRR=0 行程/尺寸=RRRR/SSSS=0/3中间符号为(0/3,5)查(P70页)表5-11 亮度AC码表得0/3 的码字为100ZZ(1)=5为正数,所以3位附加位直接用5的二进制码101所以得到ZZ(1)编码100101(3). 对AC系数ZZ(2)=-2,查找(P69页)表5-10 AC差值范围落入(-3...-2,2 (2)得SSSS为2;因为与ZZ(2)间无0个数,所以RRRR=0 行程/尺寸=RRRR/SSSS=0/2中间符号为(0/2,-2)查(P70页)表5-11 亮度AC码表得0/2 的码字为01而ZZ(2)=-2为负数,所以2位附加位使用ZZ(2)-1=-2-1=-3,-3的二进制为-11 取-11的补码-01的低2位二进制码为01所以得到ZZ(2)编码0101(4). 对AC系数ZZ(3)=0 ZZ(4)=2,中间有一个0,ZZ(4)=2 查找(P69页)表5-10 AC差值范围落入(-3...-2,2 (2)得SSSS为2;因为与ZZ(3)间有1个0,所以RRRR=1 行程/尺寸=RRRR/SSSS=1/2中间符号为(1/2,2)查(P70页)表5-11 亮度AC码表得1/2 的码字为11011而ZZ(4)=2为正数,所以2位附加位直接用2的二进制码10所以得到ZZ(3)到ZZ(4) 编码1101110(5). 对AC系数ZZ(5)到ZZ(7)=0 ,ZZ(8)=1 ,中间有3个0,ZZ(8)=1查找(P69页)表5-10 AC差值范围落入(-1,1)得SSSS为1;因为与ZZ(5)间有3个0, 所以RRRR=3 行程/尺寸=RRRR/SSSS=3/1中间符号为(3/1,1)查(P70页)表5-11 亮度AC码表得3/1 的码字为111010而ZZ(8)=1为正数,所以1位附加位直接用1的二进制码1所以得到ZZ(5)到Z(8) 编码1110101(6). ZZ(9)到ZZ(30)=0,中间0的个数:30-9+1=22 >15 ,所以先编一个F/0(ZRL)查表得到编码11111111001然后剩下RRRR=22-16=6个0,ZZ(31)=-1AC差值范围落入(-1,1)得SSSS为1;因为剩下6个0, 所以RRRR=6 行程/尺寸=RRRR/SSSS=6/1中间符号为(6/1,1)查(P70页)表5-11 亮度AC码表得6/1 的码字为1111011而ZZ(31)=-1为负数,所以1位附加位使用ZZ(31)-1=-1-1=-2,-2的二进制为-10,补码为-10取-10的低1位二进制码为0所以得到ZZ(9)到Z(31) 编码11111111001+1111011+0(7). ZZ(32)到ZZ(63)=0,由于ZZ(63)=0用EOB结束行程/尺寸=RRRR/SSSS=0/00/0 的码字为1010这样就得到了本图像子快的编码数据流为:1011100+100101+0101+1101110+1110101+11111111001+1111011+0+1010 共计54bits,而原始图像使用8*8*8=512bits,压缩比:521:54=9.48:1。
JPEG编解码过程详解
JPEG编解码过程详解(转载作者未知)默认分类2010-11-13 19:30:09 阅读26 评论0 字号:大中小订阅JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写。
它由国际电话与电报咨询委员会CCITT(The International Telegraph and Telephone Consultative Committee)与国际标准化组织ISO于1986年联合成立的一个小组,负责制定静态数字图像的编码标准。
小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的数字图像压缩编码方法,即JPEG算法。
JPEG算法被确定为国际通用标准,其适用范围广泛,除用于静态图像编码外,还推广到电视图像序列的帧内图像压缩。
而用JPEG算法压缩出来的静态图片文件称为JPEG文件,扩展名通常为*.jpg、*.jpe*.jpeg。
一.JPEG编码器和解码器的基本系统结构。
1.1 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标记。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JPEG编解码过程详解- 海王- 博客园JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写。
它由国际电话与电报咨询委员会CCITT(The International Telegraph and Telephone Consultative Committee)与国际标准化组织ISO于1986年联合成立的一个小组,负责制定静态数字图像的编码标准。
小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的数字图像压缩编码方法,即JPEG算法。
JPEG算法被确定为国际通用标准,其适用范围广泛,除用于静态图像编码外,还推广到电视图像序列的帧内图像压缩。
而用JPEG算法压缩出来的静态图片文件称为JPEG文件,扩展名通常为*.jpg、*.jpe*.jpeg。
JPEG专家组开发了两种基本的压缩算法、两种数据编码方法、四种编码模式。
具体如下:压缩算法:l 有损的离散余弦变换(Discrete Cosine Transform,DCT);l 无损的预测技术压缩。
数据编码方法:l 哈夫曼编码;l 算术编码;编码模式:l 基于DCT顺序模式:编/解码通过一次扫描完成;l 基于DCT递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进;l 无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;l 层次模式:图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息。
在实际应用中,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定义的标记表,供读者查阅。
这里仅列出几个常用标记的标记代码、占用字节长度和表示的意义。
l SOI,Start of Image,图像开始u 标记代码2字节固定值0xFFD8l APP0,Application,应用程序保留标记0u 标记代码2字节固定值0xFFE0u 包含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。
l APPn,Application,应用程序保留标记n,其中n=1~15(任选)u 标记代码2字节固定值0xFFE1~0xFFFu 包含2个具体字段:①数据长度2字节①~②2个字段的总长度即不包括标记代码,但包括本字段②详细信息数据长度-2字节内容不定例如,Adobe Photoshop生成的JPEG图像中就用了APP1和APP13两个标记段分别存储了一幅图像的副本。
l DQT,Define Quantization Table,定义量化表u 标记代码2字节固定值0xFFDBu 包含9个具体字段:①数据长度2字节字段①和多个字段②的总长度即不包括标记代码,但包括本字段②量化表数据长度-2字节a) 精度及量化表ID 1字节高4位:精度,只有两个可选值0:8位;1:16位低4位:量化表ID,取值范围为0~3b) 表项(64×(精度+1))字节例如8位精度的量化表其表项长度为64×(0+1)=64字节本标记段中,字段②可以重复出现,表示多个量化表,但最多只能出现4次。
l SOF0,Start of Frame,帧图像开始u 标记代码2字节固定值0xFFC0u 包含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次)。
l DHT,Difine Huffman Table,定义哈夫曼表u 标记代码2字节固定值0xFFC4u 包含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标记段只有一个哈夫曼表。
l DRI,Define Restart Interval,定义差分编码累计复位的间隔u 标记代码2字节固定值0xFFDDu 包含2个具体字段:①数据长度2字节固定值0x0004,①~②两个字段的总长度即不包括标记代码,但包括本字段②MCU块的单元中的重新开始间隔2字节设其值为n,则表示每n个MCU块就有一个RSTn标记。
第一个标记是RST0,第二个是RST1等,RST7后再从RST0重复。
如果没有本标记段,或间隔值为0时,就表示不存在重开始间隔和标记RSTl SOS,Start of Scan,扫描开始12字节u 标记代码2字节固定值0xFFDAu 包含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标记表示结束。
l EOI,End of Image,图像结束2字节u 标记代码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文件数据存储方式,把要解码的文件的相关信息一一读出,为接下来的解码工作做好准备。
参考方法是,设计一系列的结构体对应各个标记,并存储标记内表示的信息。
其中图像长宽、多个量化表和哈夫曼表、水平/垂直采样因子等多项信息比较重要。