已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JFIF文件格式一般的JFIF文件由下面的9个部分组成:(字段偏移量字段长度(若未说明“长度不定”则表明在任何情况下长度均为所写的值)字段内容(若未说明“内容不定”则在任何情况下内容均为所写的值,为方便表示还可以把内容设为某值),( 1 ) 图像开始SOI(Start of Image)标记0h 2字节0xFFD8( 2 ) APP0标记(Marker)0h 2字节0xFFE0 APP0长度(length)(九个字段的总长度)2h 2字节内容不定(九个字段的总长度) 标识符(identifier)4h 5字节0x4A46494600即“JFIF0” 版本号(version)9h 2字节0x0102 JFIF的版本号目前基本上都是1.2 X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)bh 1字节只有0,1,2三个值可选,其分别代表的意义如上 X方向像素密度(X density)ch 2字节取值范围未知 Y方向像素密度(Y density)eh 2字节取值范围未知 缩略图水平像素数目(thumbnail horizontal pixels)10h 1字节取值范围未知 缩略图垂直像素数目(thumbnail vertical pixels)11h 1字节取值范围未知 缩略图RGB位图(thumbnail RGB bitmap) 12h长度可能是3的倍数内容不定 本段(APP0)可以包含图像的一个微缩版本,存为24位的RGB像素。如果没有微缩图像(这种情况更常见),则“缩略图水平像素数目”和“缩略图垂直像素数目”的值均为0。( 3 ) APPn标记(Markers),其中n=115(任选) APPn长度(length)(两个字段的总长度) 详细信息(application specific information)对每个APP:若为APPN(N1F(以16进制表示,N任选其中一个) 标记:mh 2字节0xFFEN 长度:(m+2)h 2字节内容不定(设为n(10进制)(本字段与下一字段的总长度) 详细信息:(m+4)h n2字节(即长度减2)内容不定( 4 ) 一个或者多个量化表DQT(Difine Quantization Table) 0h 2字节0xFFDB 量化表长度(quantization table length)(两个字段的总长度)2h 2字节内容不定(两个字段的总长度) 量化表(quantization table)A. P/T(高四位:精度,低四位:表ID)B. 表项对每个量化表: P/T(高四位:精度,低四位:表ID) mh 1字节精度, 0表示8 bit, 1表示16 bit;ID取值范围为03,否则错误 表项 (m+1)h (64(精度+1)字节内容长,故略( 5 ) 帧图像开始SOF0(Start of Frame) 0h 2字节0xFFC0 帧开始长度(start of frame length)(六个字段的总长度)2h 2字节内容不定(六个字段的总长度) 精度(precision),每个颜色分量每个像素的位数(bits per pixel per color component)4h 1字节每个样本位数,通常是8 (大多数软件不支持12和16) 图像高度(image height) 5h 2字节内容不定(如果不支持DNL就必须0) 图像宽度(image width) 7h 2字节内容不定(如果不支持DNL就必须0) 颜色分量数(number of color components)9h 1字节内容不定(灰度图是1, YCbCr/YIQ彩色图是3, CMYK彩色图是4,我们这里讨论的JFIF使用的是YCbCr,故这里颜色分量数为3) 对每个颜色分量(for each component)A. IDB. 垂直方向的样本因子(vertical sample factor)C. 水平方向的样本因子(horizontal sample factor) B、C共占用1字节,B占用低4位,C占用高4位)D. 量化表号(quantization table#)JFIF格式使用的是YCbCr所以有3个分量(这里特别要注意的是颜色分量的ID号是有含义的,1代表Y,2代表Cb,3代表Cr,4代表I,5代表Q):1) ID ah 1字节0x01(高四位)水平(低四位)垂直样本因子 bh共1字节0x227量化表号 ch 1字节内容不定(本分量使用的量化表的ID号)2) ID dh 1字节0x02(高四位)水平(低四位)垂直样本因子 eh共1字节0x11J量化表号 fh 1字节内容不定(本分量使用的量化表的ID号)3) ID 10h 1字节0x03(高四位)水平(低四位)垂直样本因子 11h共1字节0x11量化表号 12h 1字节内容不定(本分量使用的量化表的ID号)( 6 ) 一个或者多个霍夫曼表DHT(Difine Huffman Table) 0h 2字节0xFFC4 霍夫曼表的长度(Huffman table length)(两个字段的总长度)2h 2字节内容不定(两个字段的总长度) 对每个霍夫曼表(一般情况下,霍夫曼表不止一个,但是绝对不多于4个)A. 表号B. 类型:AC或者DC(其中0:DC表,1:AC表);A、B共占用1字节,A占用低4位,B占用高4位)C. 长16个字节的编码,其代码代数和为接下来的编码的长度D. 内容编码对每个霍夫曼表:(高四位)类型和(低四位)表号:mh共1字节内容不定(有四个可能:0x00表示第0个DC表,0x01表示第1个DC表,0x10表示第0个AC表,0x11表示第1个AC表) 长16个字节的编码:(m+1)h 16字节内容不定(设这16个字节上数据之和为n) 内容编码:(m+17)h n字节内容长,故略)( 7 ) 定义重新开始间隔DRI(Difine Restart Interval) (在没有DRI标记,或间隔为零时,就不存在重新开始间隔和重开始标记) 0h 2字节0xFFDD 长度 2h 2字节0x0004(两个字段的总长度) MCU块的单元中的重新开始间隔4h 2字节内容不定(设为n,则意思是说,每n个MCU块就有一个RSTn标记。第一个标记是RST0,然后是RST1等,RST7后再从RST0重复)( 8 ) 扫描开始SOS(Start of Scan) 0h 2字节0xFFDA 扫描开始长度(start of scan length)2h 2字节内容不定(再加上的A/B/C的总长度) 颜色分量数(number of color components)4h 1字节应该和的值相同(灰度图是1, YCbCr/YIQ彩色图是3, CMYK彩色图是4) 每个颜色分量A. IDB. 交流系数表号(AC table #)C. 直流系数表号(DC table #)(B、C共占用1字节,B:占用低4位,C:占用高4位)由得到这里的颜色分量数为3(这里的颜色分量的ID号的含义和的一样,1代表Y,2代表Cb,3代表Cr,4代表I,5代表Q):1) ID 5h 1字节0x01(高四位)直流(低四位)交流数表号6h共1字节0x002) ID 7h 1字节0x027(高四位)直流(低四位)交流数表号8h共1字节0x113) ID9h 1字节0x03 (高四位)直流(低四位)交流数表号ah共1字节0x11 压缩图像数据(compressed image data)A. 谱选择开始 bh 1字节0x00B. 谱选择结束 ch 1字节0x3FC. 两个4位字段,高位和低位的谱选择 dh 1字节在基本JPEG中总为0x00D. 数据 eh长度不定内容长,故略( 9 ) 图像结束EOI(End of Image) 0h 2字节0xFFD9JPEG标准和上机实践-压缩原理:原理之一:利用人类的视觉特点是对亮度分量的精度敏感,而对色差分量的精度迟钝,利用这一性质将RGB信号变换亮度和色差之后进行编码。实现:RGB颜色空间-YCrCb颜色模型原理之二:基于视觉特点来抑制高频部分实现:离散余弦变化(DCT)+量化原理之三:完全可逆的熵编码,使比特序列更小我们采用的熵编码是霍夫曼编码原理一YCrCb 颜色模型JPEG的图片使用的是YCrCb颜色模型,而不是计算机上最常用的 RGB.关于色彩模型,这里不多阐述.只是说明,YCrCb模型更适合图形压缩.因为人眼对图片上的亮度 Y的变化远比色度C的变化敏感.我们完全可以每个点保存一个8bit的亮度值,每2x2个点保存一个Cr Cb值, 而图象在肉眼中的感觉不会起太大的变化. 所以, 原来用 RGB模型, 4个点需要 4x3=12字节. 而现在仅需要4+2=6字节; 平均每个点占12bit. 当然JPEG格式里允许每个点的 C值都记录下来;不过MPEG里都是按12bit 一个点来存放的,我们简写为 YUV12. Y = 0.299*R + 0.587*G + 0.114*B (亮度) Cb = - 0.1687*R - 0.3313*G + 0.5 *B (色差)Cr = 0.5 *R - 0.4187*G - 0.0813*B (色差)对应代码文件:ColorConversion.c原理二DCT变化JPEG里,要对数据压缩,先要做一次DCT变换.DCT变换的原理,涉及到数学 知识,这里我们不必深究.反正和傅立叶变换(学过高数的都知道)是差不多了. 经过这个变换,就把图片里点和点间的规律呈现出来了,更方便压缩.JPEG 里是对每8x8 个点为一个单位处理的.所以如果原始图片的长宽不是8的倍数, 都需要先补成8 的倍数, 好一块块的处理. 另外,记得刚才我说的Cr Cb 都是2x2记录一次吗?所以大多数情况, 是要补成16x16的整数块.按从左到右, 从上到下的次序排列(和我们写字的次序一样).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 这样数列里的相邻点在图片上也是相邻的了.对应代码文件:dct.c第一步:先计算一行中与行号i无关的部分,即T(i,v) = f(i,j)cos(2j+1)vPI/16)这部分(叠加变量是j),并将结果存在该行的第i行第v列。第二步:按列求和,F(u,v) = T(i,v)cos(2i+1)uPI/16);(叠加变量是i)量化对于前面得到的 64 个空间频率振幅值, 我们将对它们作幅度分层量化操作.方法就是分别除以量化表里对应值并四舍五入. 这个步骤除掉了一些高频量, 损失了很高 细节. 但事实上人眼对高空间频率远没有低频敏感.所以处理后的视觉损失很小. 另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程. 大量的图象 信息被包含在低空间频率中. 经过量化处理后, 在高空间频率段, 将出现大量连续的零. 下面有张 JPEG 标准量化表. 16 11 10 16 24 40 51 61 12 12 14 19 26 58 60 55 14 13 16 24 40 57 69 56 14 17 22 29 51 87 80 62 18 22 37 56 68 109 103 77 24 35 55 64 81 104 113 92 49 64 78 87 103 121 120 101 72 92 95 98 112 100 103 99 对应代码文件:zzq.c原理三RLE 编码现在我们经过DCT和量化步骤后的矢量中有许多连续的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 经过RLC压缩后就是(0,57);(0,45);(4,23);(1,-30);(0,-16);(2,1); EOB EOB是一个结束标记,表示后面都是0了.实际上,我们用(0,0)表示EOB 但是,如果这组数字不以0结束, 那么就不需要 EOB. 霍夫曼编码为了提高储存效率,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 3 = 11 取反 00 还是来看前面的例子: (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编码为 111000 69 = (4,5) - 1111111110011001 21 = (1,5) - 11111110110 4 = (0,4) - 1011 33 = (2,1) - 11011 0 = EOB = (0,0) - 1010 那么最后对于前面的例子表示的63个系数(记得我们将第一个跳过了吗?) 按位流写入JPG 文件中就是这样的: 111000 111001 111000 101101 1111111110011001 10111 11111110110 00001 1011 0111 11011 1 1010 记得刚才我们跳过了每组64个数据的第一个吧, DC 就是指的这个数字(后面63 个简称AC)JPEG的作者指出连续块的DC率之间有很紧密的联系, 因此他们决定对8x8块的DC值的差别进行编码.(Y,Cb,Cr分别有自己的DC) Diff = DC(i) - DC(i-1) 所以这一块的 DC(i) 就是: DC(i) = DC(i-1) + Diff JPG 从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 对应代码文件:huffman.c 下面简单叙述一下针对一个数据单元的图片 Y 的解码 - 在整个图片解码的开始, 你需要先初始化 DC 值为 0. 1) 先解码 DC: a) 取得一个 Huffman 码 (使用 Huffman DC 表) b) Huffman解码, 看看后面的数据位数 N c) 取得 N 位, 计算 Diff 值 d) DC + = Diff e) 写入 DC 值: vector0=DC 2) 解码 63 个 AC: - 循环处理每个 AC 直到 EOB 或者处理到 64 个 AC a) 取得一个 Huffman 码 (使用 Huffman AC 表) b) Huffman 解码, 得到 (前面 0 数量, 组号) 记住: 如果是(0,0) 就是 EOB 了 c) 取得 N 位(组号) 计算 AC d) 写入相应数量的 0 e) 接下来写入 AC -代码流程1) RGB颜色空间-YCrCb颜色模型2) CrCb采样3)DCT变换4)量化5)霍夫曼编码 JPEG文件格式-对应代码文件:jpeg.cJPEG的文件格式 JPEG文件大体上可以分成以下两个部分:标记码(Tag)加压缩数据。先介绍标记码部分。 标记码部分给出了JPEG图象的所有信息(有点类似于BMP中的头信息,但要复杂的多),如图象的宽、高、Huffman表、量化表等等。标记码有很多,但绝大多数的JPEG文件只包含几种。 注意 JPEG/JFIF 文件格式使用 Motorola 格式,而不是Intel格式,就是说,如果是一个字的话, 高字节在前, 低字节在后. JPG文件是由一个个段(segments)构成的.每个段长度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 号
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江丽水市经济和信息化局招聘派遣制工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 河南许昌市科学技术馆2025年下半年招考工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 医务人才就业协议书
- 江苏无锡市惠山区事业单位公开招聘26名工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 杭州市国土资源中心招考1名合同制工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 养猫领养协议书范本
- 出售个人房屋协议书
- 广州市荔湾区金花街道办事处招考易考易错模拟试题(共500题)试卷后附参考答案
- 公司改合同竞业协议
- 村委会造林合同协议
- 北欧风格室内设计讲解
- 2025亚洲烟草产业市场供求状况及投资前景规划研究报告
- 边界联检工作总结
- XX集团董事会2025年度工作报告
- 全科医学科慢性病综合管理指南
- 2026年气溶胶灭火系统市场研究报告
- 兄弟放弃继承协议书
- 矿山个人劳务合同范本
- 医美胶原蛋白课件
- 2025版《煤矿安全规程》权威逐条解读第六编应急救援
- 人工智能+数据安全智能监控与异常检测研究报告
评论
0/150
提交评论