JPEG图像格式详解

合集下载

[指南]JPEG格式详细内容

[指南]JPEG格式详细内容

[指南]JPEG格式详细内容JPEG格式详细内容科研学习 2009-05-21 11:20:09 阅读129 评论0 字号:大中小订阅 JPEG是目前静态图像中压缩比最高的,采用有损压缩,失真程度非常小,肉眼几乎无法辨认,当然也支持有损压缩,但压缩比就不能达到那么高。

JPEG被广泛应用于多媒体和网络程序中,其中HTML语言中标准的图像格式之一就是JPEG文件格式,另一种是GIF文件格式。

JPEG编码分为基于离散余弦变换的DCT有失真压缩和使用预测器无失真压缩。

按编码顺序,又分为顺序式编码(sequential encoding)和递增式编码(progressive encoding),前者是按从左到右、从上到下,后者是分次处理,从模糊到清晰的方式。

基于DCT 变换的JPEG,可分为仅能接受每像素点以8位标识的基本图像处理(Baseline Process)模式和接受每个像素点8位或12位表示的扩展图像处理(Extended Process)模式。

最常用的是基于DCT变换的顺序型基本图像处理模式(Baseline Process)。

8*8的图像经过DCT变换后,其低频分量都集中在左上角,高频分量分布在右下角。

由于低频分量包含图象的主要信息如亮度,因此,编码时我们忽略图像的高频分量,达到压缩的目的。

量化是信息损失的根源,将某一个值除以量化表中对应的值,由于量化表左上角的值较小,右上角的值较大,这样就起到了保持低频分量,抑制高频分量的目的。

JPEG使用的颜色系统是YCC系统,Y是亮度信息,CC是色调信息,对Y进行细量化,对CC粗量化,brbrbr提高压缩比。

JPEG文件大体分两部分:标记码(tag)和压缩数据。

标记码给出了图象的所有信息,如图像的宽和高,Huffman表,量化表等。

标记码的结构为:SOIDQTDRISOF0DHTSOS……EOI每个标记码都有2个字节组成,高字节固定为0xFF。

每个标记码之前可以填上个数不限的填充字节0xFF。

什么是jpg或jpeg格式照片

什么是jpg或jpeg格式照片

什么是jpg或jpeg格式照片在当今数字化的世界中,我们经常听到图片格式的名字,比如jpg或jpeg。

那么,什么是jpg或jpeg格式照片呢?为什么它们如此普遍且广泛使用?本文将深入探讨这些问题,并解释它们的特点和优势。

首先,让我们了解一下jpg和jpeg这两个名词。

JPG是“Joint Photographic Experts Group”的缩写,这是国际标准化组织(ISO)和国际电工委员会(IEC)共同制定的一种常见的图像压缩格式。

而JPEG是JPG的一种变体,代表着“Joint Photographic Experts Group”。

实际上,jpg和jpeg是同一种图像格式,只是在扩展名上稍有区别。

为什么jpg或jpeg格式如此常见?这主要是因为它们具有广泛的应用和许多优势。

首先,jpg或jpeg格式的照片文件相对较小。

这意味着它们在存储和传输时占用的空间和带宽较小,对于网络上传和下载速度较慢的情况下非常有用。

这使得它们成为 web 页面上图片的首选格式,可以快速加载和显示。

其次,jpg或jpeg格式的图像具有很好的可视化质量。

这种格式使用了一种被称为“有损压缩”的技术,通过去除图像中一些不可见的细节和色彩变化来减小文件大小,而人眼无法察觉这些细微的差异。

这就使得图片在不损失太多细节的情况下大大减小了文件大小。

此外,jpg或jpeg格式支持的颜色深度非常广泛。

它们可以支持从黑白图像到真彩色图像的许多不同颜色深度。

这使得jpg或jpeg这种格式成为数字摄影中最广泛使用的格式之一,无论是在单反相机还是智能手机中拍摄的照片都可以使用该格式进行存储和共享。

然而,jpg或jpeg格式也有一些局限性。

最显著的是,由于其有损压缩的方式,每次重新保存该格式的图片时都会有一定程度的质量损失。

当多次编辑和保存图片时,这种质量损失可能会逐渐累积,并最终导致图片的可见质量下降。

因此,对于那些需要经常编辑和处理照片的专业摄影师来说,其他无损格式如PNG可能更加适合。

图片格式介绍

图片格式介绍

图片格式介绍在当今信息爆炸的时代,图片已经成为人们表达思想、记录记忆的重要方式之一。

而选择合适的图片格式,不仅可以保证图片的质量,还能够方便我们的使用和分享。

本文将介绍几种常见的图片格式,并对其特点和应用场景进行详细说明。

一、JPEG(Joint Photographic Experts Group)JPEG是一种广泛应用于数字图像压缩和传输的格式,常见的文件后缀为.jpg或.jpeg。

JPEG采用有损压缩算法,能够在一定程度上减小文件大小,但会引起画质的损失。

JPEG格式适用于照片、图像和复杂的艺术图案,因为可以保留大量的颜色和细节信息。

这种格式的图片适合用于网页、电子邮件附件和社交媒体上传。

二、PNG(Portable Network Graphics)PNG是一种无损图像压缩格式,常见的文件后缀为.png。

相比于JPEG,PNG格式不会导致画质损失,可以保留更多的细节。

此外,PNG支持透明度通道,可以创建带有透明背景的图片。

由于PNG格式的图片文件相对较大,因此适用于一些对画质要求较高或需要保留透明背景的图像,例如公司LOGO、产品包装等。

三、GIF(Graphics Interchange Format)GIF是一种常用的无损压缩格式,常见的文件后缀为.gif。

GIF格式支持动画图像,可以将多个图像帧合成动画,并可以实现简单的透明效果。

此外,GIF格式还支持简单的色彩表,最多可使用256种颜色。

这种格式的文件大小通常较小,适合用于表情包、简单动画以及网页中的图标和按钮。

四、BMP(Bitmap)BMP是一种未经压缩的位图图像格式,常见的文件后缀为.bmp。

BMP格式的图片文件保存了每个像素的颜色信息,可以实现最高质量的图像显示。

然而,这也导致了BMP格式的图片文件相对较大,不适合网络传输和存储。

BMP格式适用于打印、编辑和处理高质量图像。

五、TIFF(Tagged Image File Format)TIFF是一种适用于存储和传输大型高质量图像的格式,常见的文件后缀为.tiff或.tif。

JPEG图像格式详解

JPEG图像格式详解

JPEG图像格式详解JPEG压缩简介-------------1.色彩模型JPEG的图片使用的是YCrCb颜色模型,而不是计算机上最常用的RGB.关于色彩模型,这里不多阐述.只是说明,YCrCb模型更适合图形压缩.因为人眼对图片上的亮度Y的变化远比色度C的变化敏感.我们完全可以每个点保存一个8bit的亮度值,每2x2个点保存一个Cr Cb值,而图象在肉眼中的感觉不会起太大的变化.所以,原来用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.2990.5870.114||R||0||Cb|=|-0.1687-0.33130.5|*|G|+|128||Cr||0.5-0.4187-0.0813||B||128|Y=0.299*R+0.587*G+0.114*B(亮度)Cb=-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变换的原理,涉及到数学知识,这里我们不必深究.反正和傅立叶变换(学过高数的都知道)是差不多了.经过个点为一个单位处理的.所以如果原始图片的长宽不是8的倍数,都需要先补成8的倍数,好一块块的处理.另外,记得刚才我说的Cr Cb都是2x2记录一次吗?所以大多数情况,是要补成16x16的整数块.按从左到右,从上到下的次序排列(和我们写字的次序一样).JPEG里是对Y Cr Cb分别做DCT变换的.这里进行DCT变换的Y,Cr,Cb值的范围都是-128~127.(Y被减去128)JPEG编码时使用的是Forward DCT(FDCT)解码时使用的Inverse DCT(IDCT)下面给出公式:FDCT:772*x+12*y+1F(u,v)=alpha(u)*alpha(v)*sum sum f(x,y)*cos(-------*u*PI)*cos(------*v*PI)x=0y=01616u,v=0,1,...,7{1/sqrt(8)(u==0)alpha(u)={{1/2(u!=0)IDCT:772*x+12*y+1f(x,y)=sum sum alpha(u)*alpha(v)*F(u,v)*cos(-------*u*PI)*cos(------*v*PI) u=0v=01616x,y=0,1 (7)这个步骤很花时间,另外有种AA&N优化算法,大家可以去inet自己找一下.在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,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标准量化表.(按上面同样的弯曲次序排列)1611101624405161121214192658605514131624405769561417222951878062182237566810910377243555648110411392496478871031211201017292959811210010399这张表依据心理视觉阀制作,对8bit的亮度和色度的图象的处理效果不错.当然我们可以使用任意的量化表.量化表是定义在jpeg的DQT标记后.一般为Y值定义一个,为C值定义一个.量化表是控制JPEG压缩比的关键.这个步骤除掉了一些高频量,损失了很高细节.但事实上人眼对高空间频率远没有低频敏感.所以处理后的视觉损失很小.另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程.大量的图象信息被包含在低空间频率中.经过量化处理后,在高空间频率段,将出现大量连续的零.注意,量化后的数据有可能超过2byte有符号整数的处理范围.5.0RLE编码现在我们矢量中有许多连续的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的数量的必须是4bit,就是说,只能是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组:数值组实际保存值00--1,110,1-3,-2,2,3200,01,10,11-7,-6,-5,-4,4,5,6,73000,001,010,011,100,101,110,111 -15,..,-8,8,..,1540000,..,0111,1000,..,1111-31,..,-16,16,..,31500000,..,01111,10000,..,11111-63,..,-32,32,..,636.-127,..,-64,64,..,1277.-255,..,-128,128,..,2558.-511,..,-256,256,..,5119.-1023,..,-512,512,..,102310.-2047,..,-1024,1024,..,204711.-4095,..,-2048,2048,..,409512.-8191,..,-4096,4096,..,819113.-16383,..,-8192,8192,..,1638314.-32767,..,-16384,16384,..,3276715.还是来看前面的例子:(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(06对应111000为查表所得.对应成1~16bits的不定长数值.出现频率高的数字小于8bits,频率低的大于8bits,从而使整个的数据长度降低,关于huffman压缩算法,请查阅相关资料)69=(4,5)---1111111110011001(注:69=4*16+5=0x45)21=(1,5)---111111101104=(0,4)---101133=(2,1)---110110=EOB=(0,0)---1010那么最后对于前面的例子表示的63个系数(记得我们将第一个跳过了吗?)按位流写入JPG文件中就是这样的: 1110001110011110001011011111111110011001101111111111011000001 1011011111011110107.DC的编码-----------记得刚才我们跳过了每组64个数据的第一个吧,DC就是指的这个数字(后面63个简称AC)代入前面的FDCT公式可以得到c(0,0)77DC=F(0,0)=---------*sum sum f(x,y)*cos0*cos0其中c(0,0)=1/24x=0y=0177=---*sum sum f(x,y)8x=0y=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的Huffman编码是1111110(在JPG文件中,一般有两个Huffman表,一个是DC用,一个是AC用)那么在JPG文件中,DC的2进制表示为1111110000000000它将放在63个AC的前面,上面上个例子的最终BIT流如下:1111110000000000111000111001111000101101111111111001100110111 1111111011000001101101111101111010解码过程简述-------------8.一个数据单元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或者处理到64个ACa)取得一个Huffman码(使用Huffman AC表)b)Huffman解码,得到(前面0数量,组号)[记住:如果是(0,0)就是EOB了]c)取得N位(组号)计算ACd)写入相应数量的0e)接下来写入AC-----------------下一步的解码------------上一步我们得到了64个矢量.下面我们还需要做一些解码工作:2)重排列64个矢量到8x8的块中3)对8x8的块作IDCT对8x8块的(Y,Cb,Cr)重复上面的操作[Huffman解码,步骤1),2),3)]4)将所有的8bit数加上1285)转换YCbCr到RGB9.JPG文件(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,那么就用0xFF0x00代替.就是说在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--...)10.标记-------下面是必须处理的标记SOF0=Start Of Frame0=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=FFC411.JPG文件中Haffman表的储存-----------------------------JPEG里定义了一张表来描述Haffman树.定义在DHT标记后面.注意:Haffman代码的长度限制在16bit内.一般一个JPG文件里会有2类Haffman表:一个用于DC一个用于AC(实际有4个表,亮度的DC,AC两个,色度的DC,AC两个)这张表是这样保存的:1)16字节:第i字节表示了i位长的Huffman代码的个数(i=1到16)2)这表的长度(字节数)=这16个数字之和现在你可以想象这张表怎么存放的吧?对应字节就是对应Haffman代码等价数字.我不多解释,这需要你先了解Haffman算法.这里只举一个例子:Haffman表的表头是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.....如果表下面的数据是4557291723253428就是说45=0057=0129=10017=10123=110等等...如果你懂Haffman编码,这些不难理解12.采样系数-----------下面讲解的都是真彩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个原始数据,经过RLE,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*8x Vmax*8)这里Hmax=HY=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)标记后13.简单说一下JPG文件的解码-------------------------解码程序先从JPG文件中读出采样系数,这样就知道了MCU的大小,算出整个图象有几个MCU.解码程序再循环逐个对MCU解码,一直到检查到EOI标记.对于每个MCU,按正规的次序解出每个DU,然后组合,转换成(R,G,B)就OK了附:JPEG文件格式~~~~~~~~~~~~~~~~-文件头(2bytes):$ff,$d8(SOI)(JPEG文件标识)-任意数量的段,见后面-文件结束(2bytes):$ff,$d9(EOI)段的格式:~~~~~~~~~-header(4bytes):$ff段标识n段的类型(1byte)sh,sl该段长度,包括这两个字节,但是不包括前面的$ff和n.注意:长度不是intel次序,而是Motorola的,高字节在前,低字节在后!-该段的内容,最多65533字节注意:-有一些无参数的段(下面那些前面注明星号的)这些段没有长度描述(而且没有内容),只有$ff和类型字节.-段之间无论有多少$ff都是合法的,必须被忽略掉.段的类型:*TEM=$01可以忽略掉SOF0=$c0帧开始(baseline JPEG),细节附后SOF1=$c1ditoSOF2=$c2通常不支持SOF3=$c3通常不支持SOF5=$c5通常不支持SOF6=$c6通常不支持SOF7=$c7通常不支持SOF9=$c9arithmetic编码(Huffman的一种扩展算法),通常不支持SOF10=$ca通常不支持SOF11=$cb通常不支持SOF13=$cd通常不支持SOF14=$ce通常不支持SOF14=$ce通常不支持SOF15=$cf通常不支持DHT=$c4定义Huffman Table,细节附后JPG=$c8未定义/保留(引起解码错误)DAC=$cc定义Arithmetic Table,通常不支持*RST0=$d0RSTn用于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=$e0JFIF APP0segment marker(细节略)APP15=$ef忽略JPG0=$f0忽略(跳过)JPG13=$fd忽略(跳过)COM=$fe注释,细节附后其它的段类型都保留必须跳过SOF0:Start Of Frame0:~~~~~~~~~~~~~~~~~~~~~~~-$ff,$c0(SOF0)-长度(高字节,低字节),8+components*3-数据精度(1byte)每个样本位数,通常是8(大多数软件不支持12和16) -图片高度(高字节,低字节),如果不支持DNL就必须>0-图片宽度(高字节,低字节),如果不支持DNL就必须>0-components数量(1byte),灰度图是1,YCbCr/YIQ彩色图是3,CMYK彩色图是4-每个component:3bytes-component id(1=Y,2=Cb,3=Cr,4=I,5=Q)-采样系数(bit0-3vert.,4-7hor.)-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信息(1byte):bit0..3:QT号(0..3,否则错误)bit 4..7:QT精度,0=8bit,否则16bit-n字节的QT,n=64*(精度+1)备注:-一个单独的DQT段可以包含多个QT,每个都有自己的信息字节-当精度=1(16bit),每个字都是高位在前低位在后DAC:Define Arithmetic Table:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~法律原因,现在的软件不支持arithmetic编码.不能生产使用arithmetic编码的JPEG文件DHT:Define Huffman Table:~~~~~~~~~~~~~~~~~~~~~~~~~~-$ff,$c4(DHT)-长度(高字节,低字节)-HT信息(1byte):bit0..3:HT号(0..3,否则错误)bit4:HT类型,0=DC table,1=AC tablebit 5..7:必须是0-16bytes:长度是 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*(扫描行内组件的数量)-扫描行内组件的数量(1byte),必须>=1,<=4(否则是错的)通常是3 -每个组件:2bytes-component id(1=Y,2=Cb,3=Cr,4=I,5=Q),见SOF0-使用的Huffman表:-bit0..3:AC table(0..3)-bit 4..7:DC table(0..3)-忽略3bytes(???)备注:-图片数据(一个个扫描行)紧接着SOS段.。

jpeg文件格式标准

jpeg文件格式标准

jpeg文件格式标准摘要:本文介绍了JPEG文件格式标准的基本知识,包括其历史背景、文件结构、压缩算法以及应用领域。

通过深入理解JPEG文件格式标准,读者可以更好地掌握该标准的使用和应用。

1. 简介JPEG,全称为Joint Photographic Experts Group,是一种常用的图像压缩格式。

该格式广泛应用于数字摄影、图像处理、图像存储等领域。

通过对图像进行有损压缩,JPEG可以在保持图片质量的同时减小文件大小,提高传输和存储的效率。

2. 历史背景JPEG文件格式标准最早于1992年发布。

它是由以同名组织命名的Joint Photographic Experts Group制定的。

该标准的制定旨在寻找一种通用的图像压缩方法,以适应当时数字图像处理领域的发展需求。

3. 文件结构JPEG文件由多个部分组成,其中最重要的是图像数据和文件头。

3.1 文件头JPEG文件头以SOI(Start of Image)标记开始,用于标识该文件是一个JPEG图像。

紧接着是APP(Application Segment)标记,用于存储一些可选信息,如图像的创建软件、版本等。

3.2 图像数据JPEG文件中的图像数据以帧(Frame)的形式存在。

一个JPEG文件可以包含多个帧,每个帧可以包含多个扫描(Scan)。

每个扫描由若干个组成,每个组包含了一组相邻的像素。

4. 压缩算法JPEG文件格式通过压缩算法实现对图像的有损压缩。

JPEG压缩算法主要包含两个过程:离散余弦变换(DCT)和量化。

4.1 离散余弦变换(DCT)DCT是一种常用的信号处理技术,用于将时域信号变换为频域信号。

在JPEG压缩中,DCT被用于将原始图像信号转换为一组频谱系数。

4.2 量化量化是JPEG压缩中的另一个重要步骤,它将DCT变换后的频谱系数进行量化处理。

通过设定不同的量化表,可以实现不同程度的压缩效果。

5. 应用领域JPEG文件格式在众多领域都有广泛应用,特别是数字摄影、图像处理和图像存储等方面。

JPEG图像编码标准

JPEG图像编码标准

SOF0
SOF1 SOF2
0xFFC0
0xFFC1 0xFFC2
Baseline DCT
Extended sequential DCT Progressive DCT
SOF3
SOF5 SOF6 SOF7
0xFFC3
0xFFC5 0xFFC6 0xFFC7
Spatial (sequential) lossless
JPEG图像压缩编码算法
JPEG 2000简介
参考文献
§3.4.1
JPEG与JPEG图像
一、ISO/IEC JPEG (Joint Photographic Experts Group)简介 二、关于JPEG图像
A、参 考 文 献
一. 关于JPEG
• •
JPEG : Joint Photographic Experts Group 由ISO与IEC于1986年联合成立的一个专家委员会(WG1), 其宪章(charter)是:
0xE0
0xE1 - 0xEF 0xDB 0xC0 0xC4 0xDA 0xD9
第三章 图形、图像与视频处理技术
JPEG图像格式简介 (cont.)

附表:JPEG定义的标记列表
Symbol (符号) Code Assignment (标记代码) Description (说明)
Start Of Frame markers, non-hierarchical Huffman coding
第三 图形、图像与视频处理技术 4
2013年9月10日
关于JPEG (cont.)

已经发布的标准有:
ISO/IEC 10918-1 | ITU-T Rec. T.81 : Requirements and guidelines ISO/IEC 10918-2 | ITU-T Rec. T.83 : Compliance testing

JPEG文件格式简单分析.

JPEG文件格式简单分析.

摘要:这篇文章大体上介绍了JPEG文件的结构信息以及它的压缩算法和编码方式。

使读者能够对JPEG文件格式有大体上的了解。

为读者进一步进行学习JPEG文件压缩做好准备关键字:十六进制,段格式,编码一、JPEG文件格式概述:图像和动画的存储方式是一个很重要的问题。

幸好我们有了数据压缩,有了JPEG等多种压缩存储图像的文件格式,我们今天才能够拿着小小的一个存储器,却存上许多张色彩鲜艳的图片。

如果没有图像压缩算法,也许我们的多媒体时代就会晚到来许多年。

JPEG图像存储格式一个比较成熟的图像有损压缩格式,虽然一个图片经过转化为JPEG图像后,一些数据会丢失,但是,人眼是很不容易分辨出来这种差别的。

也就是说,JPEG图像存储格式既满足了人眼对色彩和分辨率的要求,又适当的去除了图像中很难被人眼所分辨出的色彩,在图像的清晰与大小中JPEG找到了一个很好的平衡点。

虽然图像转化为JPEG格式会减小很多,但是并不是文件就变得简单了,相反,JPEG文件的格式是比较复杂的。

不经过认真地分析,是不容易弄懂它的。

二、JPEG文件的存储方式:JPEG文件的格式是分为一个一个的段来存储的(但并不是全部都是段),段的多少和长度并不是一定的。

只要包含了足够的信息,该JPEG文件就能够被打开,呈现给人们。

JPEG文件的每个段都一定包含两部分一个是段的标识,它由两个字节构成:第一个字节是十六进制0xFF,第二个字节对于不同的段,这个值是不同的。

紧接着的两个字节存放的是这个段的长度(除了前面的两个字节0xFF和0xXX,X表示不确定。

他们是不算到段的长度中的)。

注意:这个长度的表示方法是按照高位在前,低位在后的,与Intel的表示方法不同。

比方说一个段的长度是0x12AB,那么它会按照0x12,0xAB的顺序存储。

但是如果按照Intel的方式:高位在后,低位在前的方式会存储成0xAB,0x12,而这样的存储方法对于JPEG是不对的。

这样的话如果一个程序不认识JPEG文件某个段,它就可以读取后两个字节,得到这个段的长度,并跳过忽略它。

jpeg格式是什么文件

jpeg格式是什么文件

jpeg格式是什么文件
jpeg格式是目前网络上最流行的图像格式,一般简称为jpg格式,是可以把图像文件压缩到最小的格式。

下面是小编为大家整理的jpeg 格式是什么文件,仅供参考,欢迎阅读。

jpeg格式是什么文件
jpeg压缩技术非常先进,而且十分灵活。

jpeg格式具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率通常在10:1到40:1之间,压缩比越大,品质就越低,相反地,压缩比越小,品质就越好。

比如可以把1.37Mb的BMP 位图文件压缩至20.3KB。

当然也可以在图像质量和文件尺寸之间找到平衡点。

但是,对于颜色较少、对比级别强烈、实心边框或纯色区域大的较简单的'作品,jpeg压缩无法提供理想的结果。

jpeg格式怎么打开
jpep文件是图片文件的一种,较为通用,特点为较高的画质和高压缩比.JPEG文件可以用任何windows自带的图片浏览软件(如xp的图片及传真查看器或IE)或图片编辑软件(如画图)打开也可以用其他任何图片浏览软件或图片编辑软件打开,常见的有ACDSee Photoshop。

jpep文件在日常生活中多用于大家的照片中,希望以后在图库中碰到jpep文件可以运用自如。

jpg格式举例详解

jpg格式举例详解

jpg格式举例详解JPEG⽂件数据结构以及将位图保存为JPG的代码⼀、简述 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文件格式

JPEG文件格式
JPEG文件由八个部分组成,每个部分的标记字节为两个,首字节固定为:0xFF,当然,准许在其前面再填充多个0xFF,以最后一个为准。下面为各部分的名称和第二个标记字节的数值,用ultraedit的16进制搜索功能可找到各部分的起始位置,在嵌入式系统中可用类似的数值匹配法定位。
一、图像开始SOI(Start of Image)标记,数值0xD8
以上为基本可供检索的信息,细节内容不是小篇幅可以说清的,那可是一本书中至少一章的内容,几十页纸啊,最好到书店去买一本相关工具书,搞图像可少不了书的。
三、APPn标记(Markers),其中n=1~15,数值对应0xE1~0xEF
1、APPn长度(length)
2、应用细节信息(application specific information)
四、一个或者多个量化表DQT(difine quantization table),数值0xDB
二、APP0标记(Marker),数值0xE0
ntifier)
3、版本号(version)
4、X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)
5、X方向像素密度(X density)
2、颜色分量数(number of color components)
3、每个颜色分量
包括:ID、交流系数表号(AC table #)、直流系数表号(DC table #)
4、压缩图像数据(compressed image data)
八、图像结束EOI(End of Image),数值0xD9
2、精度(precision),每个颜色分量每个像素的位数(bits per pixel per color component)

jpg的格式 基线 -回复

jpg的格式 基线 -回复

jpg的格式基线-回复[jpg的格式基线]JPEG(即JPG)是一种广泛使用的图像文件格式,特点是压缩比高,文件体积小,适用于在网络上传输和存储。

基线是JPEG格式的一种编码方式,通过一步一步的回答,本文将详细介绍JPEG格式的基线版本。

第一步:JPEG格式是什么?JPEG是Joint Photographic Experts Group的缩写,意为联合图像专家组。

它是一种无损的、有损的图像压缩算法,广泛用于数字摄影和网络传输中。

JPEG格式允许将图像文件压缩到较小的体积,从而提高传输速度和存储效率。

第二步:JPEG格式的基线是什么意思?JPEG格式的基线是JPEG标准的一种编码方式。

基线采用顺序扫描的方式,逐行逐列地将图像信息编码成数据流。

这种编码方式的特点是简单、高效,兼容性较好,可以被广泛支持的设备和软件解码。

第三步:JPEG基线的编码过程是什么样的?JPEG基线的编码过程主要包括图像分块、色彩空间转换、离散余弦变换、量化和熵编码等几个关键步骤。

首先,图像被分成8×8大小的块,每个块独立进行处理。

其次,根据需要,图像通常会从RGB色彩空间转换为YCbCr色彩空间。

Y通道表示亮度信息,Cb和Cr通道表示蓝色和红色的色度信息。

然后,对每个色度通道的8×8块进行离散余弦变换(DCT),将图像从空间域转换为频域。

离散余弦变换能够高效地压缩图像的能量。

接着,经过DCT变换后的频域块将进行量化。

量化是JPEG压缩的核心步骤之一,用于减少频域系数的位数,从而减小文件体积。

量化过程中,高频系数被更多地减小或舍弃,而低频系数被保留较多。

最后,量化后的频域块将进行熵编码。

熵编码通过对频域系数进行编码,使得出现概率较高的系数可以用较短的编码表示,而出现概率较低的系数则用较长的编码表示。

这种编码方式能够进一步提高压缩效率。

第四步:JPEG基线的解码过程是什么样的?JPEG基线的解码过程与编码过程正好相反。

JPEG图像数据格式简明分析

JPEG图像数据格式简明分析

总结
总的来说,JPEG图像数据格式凭借其高压缩比、兼容性强和适用范围广等优 点,成为图像处理、数字摄影、网络传输和科学数据可视化等领域的首选格式。 然而,我们也应意识到其存在的损失细节和速度较慢等缺点。未来,随着技术的 不断发展和新的图像格式的出现,JPEG可能会面临挑战。但就目前而言,JPEG仍 然是图像处理和存储领域的重要支柱。
3、离散余弦变换:接下来,图像数据将经过离散余弦变换(DCT)。DCT将 图像的像素值从空间域转换到频域,使得图像的能量集中在一些低频区域。
4、量化和编码:在完成DCT后,JPEG算法对DCT系数进行量化,将它们转换 为更小的值。然后对这些值进行编码,以产生最终的压缩数据。编码过程中使用 的哈夫曼编码(Huffman Coding)是一种无损压缩技术,它可以根据数据的统计 特性来生成更短的编码。
%读取原始图像
%将原始图像转换为灰度图像
%对灰度图像进行DCT变换
%设定量化表
quantization_table = [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;
参考内容
JPEG静态图像压缩算法是一种重要的数字图像处理技术,它通过去除图像中 的冗余信息来减小图像的文件大小,从而方便了图像的存储和传输。JPEG算法采 用了一种基于离散余弦变换(DCT)的压缩方法,将图像数据转化为一种更有效 的表示形式,从而实现了图像的压缩。
JPEG算法主要由以下几个步骤构成:
组成结构
JPEG图像数据格式的组成结构包括三个主要部分:头部、图像部分和尾部。 头部包含关于图像的一些基本信息,如文件号、量化表、色彩空间等。图像部分 是实际的图像数据,包括经DCT变换和量化的像素值。尾部包含一些附加信息, 如压缩方法、图像大小等。

JPEG图片格式简单分析

JPEG图片格式简单分析

对于花花绿绿色彩斑斓的图片,也许里面包含了艺术家的许多心血,但归根结底它就是一个文件,里面写满了16进制代码的一个文件,这些代码的前面一部分可能是介绍了这张图片的一些简单的信息,后面一大部分是它的图像数据。

这个文件的原理简单的就像是一篇小论文,题目,摘要,关键词,正文,参考文献等,那么这篇小论文的具体格式到底是什么呢?其实很简单,用ultraEdit随便打开一张jpg格式的图片就可以看到,但是要看懂里面的内容也不是一件很容易的事情,那么先看下面转载的这篇文章吧,看完它就会很容易理解JPG的文件格式了。

JPEG 图片格式简单分析1、基本常识微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分。

正序存放就是高字节存放在前低字节在后,而逆序存放就是低字节在前高字节在后。

例如,十六进制数为A02B,正序存放就是A02B,逆序存放就是2BA0。

摩托罗拉(Motorola)公司的微处理器使用正序存放,而英特尔(Intel)公司的微处理器使用逆序。

JPEG文件中的字节是按照正序排列的。

JPEG委员会在制定JPEG标准时,定义了许多标记(marker)用来区分和识别图像数据及其相关信息,但笔者没有找到JPEG委员会对JPEG文件交换格式的明确定义。

直到1998年12月从分析网上具体的JPG图像来看,使用比较广泛的还是JPEG文件交换格式(JPEG File Interchange Format,JFIF)版本号为1.02。

这是1992年9月由在C-Cube Microsystems公司工作的Eric Hamilton提出的。

此外还有TIFF JPEG 等格式,但由于这种格式比较复杂,因此大多数应用程序都支持JFIF文件交换格式。

JPEG文件使用的颜色空间是CCIR 601推荐标准进行的彩色空间(参看第7章)。

在这个彩色空间中,每个分量、每个像素的电平规定为255级,用8位代码表示。

JPEG格式

JPEG格式
JPEG格式可分为标准JPEG、渐进式JPEG及JPEG2000三种格式。
1.标准JPEG格式;此类型在网页下载时只能由上而下依序显示图像,直到图像资料全部下载完毕,才能看到 图像全貌。
性能
JPEG的性能,用质量与比特率之比来衡量,是相当优越的。它的优点是: JPEG的缺点是: JPEG的复杂度之低和使用时间之长,给人以深刻的印象。以下是对于8位/像素的中等复杂画面的图像,JPEG 所给出的几个等级作为衡量压缩编码效果的准则: 其中位/像素( bit/pixel)定义为压缩图像(包括色度分量)的总位数除以亮度分量的样本数。
压缩标准
JPEG标准
JPEG成立于1986年,该标准于1992年正式通过,它的正式名称为“信息技术连续色调静止图像的数字压缩编 码”。在JPEG算法中,共包含4种运行模式,其中一种是基于DPCM的无损压缩算法,另外3种是基于DCT的有损压 缩算法。其要点如下:
·无损压缩编码模式。采用预测法和哈夫曼编码(或算术编码)以保证重建图像与原图像完全相同(设均方 误差为零),无失真。
谢谢观看
基于DCT的分层编码模式。这种模式是以图像分辨率为基准进行图像编码的。它首先是从低分辨率开始,逐 步提高分辨率,直至与原图像的分辨率相同为止。图像重建时也是如此。
应用
JPEG格式的压缩率是目前各种图像文件格式中最高的。它用有损压缩的方式去除图像的冗余数据,但存在着 一定的失真。由于其高效的压缩效率和标准化要求,目前已广泛用于彩色传真、静止图像、**会议、印刷及新闻 图片的传送。由于各种浏览器都支持JPEG这种图像格式,因此它也被广泛用于图像预览和制作HTM网页。
简介
JPEG( Joint Photographic Experts Group)即联合图像专家组,是用于连续色调静态图像压缩的一种 标准,文件后缀名为.jpg或.jpeg,是最常用的图像文件格式。其主要是采用预测编码(DPCM)、离散余弦变换 (DCT)以及熵编码的联合编码方式,以去除冗余的图像和彩色数据,属于有损压缩格式,它能够将图像压缩在 很小的储存空间,一定程度上会造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图 像质量降低,如果追求高品质图像,则不宜采用过高的压缩比例。

JPEG图片格式详解

JPEG图片格式详解

JPEG图⽚格式详解2-1 JPEG图⽚格式详解1. JPEG格式⽂件简介JPEG(Joint Photographic Experts Group,联合图像专家⼩组),是⼀种常⽤的图像存储格式, jpg/jpeg是24位的图像⽂件格式,也是⼀种⾼效率的压缩格式,是⾯向连续⾊调静⽌图像的⼀种压缩标准。

同样⼀幅画⾯,⽤.jpg/.jpeg格式储存的⽂件是其他类型图形⽂件的1 /10~1/20。

⼀般情况下,.jpg/.jpeg⽂件只有⼏⼗KB,⽽⾊彩数最⾼却可达到24位,所以它被⼴泛运⽤在Internet上,以节约宝贵的⽹络传输资源。

1.1 拓展名.jpg与.jpegJPEG的⽂件格式⼀般有两种⽂件扩展名:.jpg和.jpeg,这两种扩展名的实质是相同的,我们可以把.jpg的⽂件改名为.jpeg,⽽对⽂件本⾝不会有任何影响。

严格来讲,JPEG的⽂件扩展名应该为.jpeg,由于DOS时代的8.3⽂件名命名原则,就使⽤了.jpg的扩展名,这种情况类似于.htm和.html的区别。

1.2 JPEG的三种格式JPEG格式可以分为:标准JPEG、渐进式JPEG 和 JPEG2000三种格式。

标准JPEG:该类型的图⽚⽂件,在⽹络上应⽤较多,只有图⽚完全被加载和读取完毕之后,才能看到图⽚的全貌;它是⼀种很灵活的图⽚压缩⽅式,⽤户可以在压缩⽐和图⽚品质之间进⾏权衡。

不过通常来讲,其压缩⽐在10:1到40:1之间,压缩⽐越⼤,品质就越差,压缩⽐越⼩,品质就越好。

渐进式JPEG:该类型的图⽚是对标准JPEG格式的改进,当在⽹页上下载渐进式JPEG图⽚时,⾸先呈现图⽚的⼤概外貌,然后再逐渐呈现具体的细节部分,因⽽被称之为渐进式JPEG。

JPEG2002:⼀种全新的图⽚压缩发,压缩品质更好,并且改善了⽆线传输时,因信号不稳定⽽造成的马赛克及位置错乱等问题。

另外,作为JPEG的升级版,JPEG2000的压缩率⽐标准JPEG⾼约30%,同时⽀持有损压缩和⽆损压缩。

深入理解JPEG图像格式Jphide隐写

深入理解JPEG图像格式Jphide隐写

深⼊理解JPEG图像格式Jphide隐写0x00 隐写原理Jphide是基于最低有效位LSB的图像隐写算法,使⽤JPEG图像作为载体是因为相⽐其他图像格式更不容易发现隐藏信息,因为JPEG图像在上进⾏隐藏⽐空间域隐藏更难检测,并且鲁棒性更强,同时有较强的抗统计检测能⼒。

由于JPEG图像格式使⽤(Discrete Cosine Transform,DCT)函数来压缩图像,⽽这个图像压缩⽅法的核⼼是:通过识别每个8×8像素块中相邻像素中的重复像素来减少显⽰图像所需的位数,并使⽤近似估算法降低其冗余度。

因此,我们可以把DCT看作⼀个⽤于执⾏压缩的近似计算⽅法。

因为丢失了部分数据,所以DCT是⼀种(Loss Compression)技术,但⼀般不会影响图像的视觉效果。

0x01 隐写过程Jphide隐写过程⼤致为:先解压压缩JPEG图像,得到DCT系数;然后对隐藏信息⽤户给定的密码进⾏Blowfish加密;再利⽤Blowfish算法⽣成伪随机序列,并据此找到需要改变的DCT系数,将其末位变为需要隐藏的信息的值。

最后把DCT系数重新压回成JPEG图⽚,下⾯是个⼈对隐写过程理解画出的⼤致流程图。

0x02 隐写实现(1)Stegdetect实现JPEG图像Jphide隐写算法⼯具有多个,⽐如由Neils Provos开发通过统计分析技术评估JPEG⽂件的DCT频率系数的隐写⼯具,它可以检测到通过JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX和Camouflage等这些隐写⼯具隐藏的信息,并且还具有基于字典暴⼒破解密码⽅法提取通过Jphide、outguess和jsteg-shell⽅式嵌⼊的隐藏信息。

(2)JPHS⽽这⾥介绍另⼀款JPEG图像的信息隐藏软件,它是由Allan Latham开发设计实现在Windows和Linux系统平台针对有损压缩JPEG⽂件进⾏信息加密隐藏和探测提取的⼯具。

jpeg是什么意思

jpeg是什么意思

jpeg是什么意思jpeg 是一种图像格式,它可以将任何颜色深度的图像转换成可以存储的格式。

jpeg 图像的文件容量很小,而且可以采取压缩。

这意味着你可以把很多图像放入 jpeg 格式文件中来减少图像的体积。

对于许多人来说, jpeg 图像和其他格式的图像相比更具有优势,因为这些文件所占的空间较小。

而且,许多网站都支持 jpeg 图像。

jpeg 图像的另外一个好处就是它们在一定程度上允许自动修改,而不需要重新压缩图像,并且这样做也会提高图像的质量。

作为一个数字图像的格式, jpeg 在与图形软件、网页浏览器、图像编辑软件以及其他支持 jpeg 的设备之间交换数据方面非常灵活方便。

如果你从一台电脑上拷贝了一张图片,那么你只需要将这张图片从这台电脑复制到你的电子邮箱或者是其他的地址即可。

这就类似于许多数码照相机、摄影机所配备的复制功能。

这时, jpeg 文件格式与你所安装的图像编辑软件以及支持jpeg 的网络浏览器间交换图像格式方面又增加了另外两项选择——flash (swf)和 html (htm、 html)。

flash 是一种互联网媒介, flash 技术主要包括三部分:开发工具、二进制代码、可执行的动画效果。

通过 flash,多媒体作品的制作变得异常简单。

flash 的应用非常广泛,包括电影、视频游戏、电视卡通、多媒体课件、网站、音乐、动画等各方面,用户只要把 swf 文件导入到 fireworks 中,然后根据需求设置相关参数,就可以创建出互动性很强的动态多媒体作品,其最大的特点是交互性,它不仅可以在网络上播放,还可以嵌入到流媒体、光盘以及实体出版物中去,这样 flash 的应用范围就更加广泛。

它已经逐渐成为广告宣传、网络演示等领域的首选。

使用 jpeg 图像,不管图像的尺寸多大,在保证图像质量的前提下,我们都尽量使用 jpeg 图像。

jpeg 格式图像不但清晰明朗,还有更大的压缩比例,因此, jpeg 图像更适合在网络上传输,同时也可以满足一般的商业用途。

JPEG及RAW图象格式

JPEG及RAW图象格式

JPEG、RAW图像格式JPEG格式—(联合国图像专家组格式)是用于压缩连续色调图像的标准格式我们常常会遇到以不同格式存储的图象文件。

由于各种图象文件格式的运算方法不同,即使像素大小相同,不同格式的文件大小差异也会很大,图象品质也有明显的不同。

无损的运算方法在不删除图象细节或颜色信息的情况下压缩文件;有损的运算方法则会删除细节。

适合数码相机使用的常见图象文件格式有JPEG、RAW两种。

我们首先来了解一下这两种图象文件格式的特点。

将图象储存为JPEG格式依赖于有损压缩,它通过有选择地扔掉数据来压缩文件。

JPEG支持RGB、CMYK和灰度颜色模式,保留RGB 图象中的所有颜色信息,在打开时自动解压缩。

对于包含大面积单色区域的图象,记录像素地址码的同时,很多相近颜色的像素信息都以同一个数据存储。

这样,同像素数量的图像因为图像的内容(如单色区域的面积/影调层次的数量)不同而似的JPEG格式文件的大小不同。

文件压缩后所占的存储空间小很多(比例可由1:2至40:1),因此可以用较小的磁盘空间得到较好的图像质量。

JPEG的这些特点使它成为目前使用范围最广泛的图像文件格式,特别是在网络应用中,由于它优异的性能,成为了一种很有发展前途的图像格式。

储存JPEG格式文件时,通常需要在储存彩旦中选取一个压缩率;压缩率越低,于是所算法保留的细节就越多,得到的图象品质越好,生成的文件需要的存储空间越大;压缩率越高,压缩算法保留的细节越少,得到的图象品质越差,生成的文件需要的存储空间越小。

为了获得最好的图象效果,可以选取最佳品质压缩,但使用高品质设置比使用低品质设置生成的文件大。

用户可以分别查看几种品质设置下的图象,按照自己的需要确定品质和文件大小之间的最佳平衡点。

另外,多次反复打开并储存同一个JPEG文件也会降低图象品质。

在用数码相机拍摄的时候,选择压缩比时令人颇为难,一般把握的原则是:1.对图像品质要求较高,需要放大照片,而且拍摄对象的色彩非常丰富、明确过渡阶调多时,宜选择低压缩比。

JPEG,PNG,TIFF,这三种图片格式有什么不同?

JPEG,PNG,TIFF,这三种图片格式有什么不同?

JPEG,PNG,TIFF,这三种图⽚格式有什么不同?JPEG,PNG,TIFF,这三种图⽚格式有什么不同,这三种图⽚格式都是⽐较常见常⽤的图⽚
格式,先说JPEG。

JPEG,常称为JPG格式,JPEG 是 Joint Photographic Experts Group 联合图像专家⼩组的缩
写,我们⼀般在⽹上,⼿机上,电脑上看到的 .jpg .jpeg 结尾的照⽚就是JPEG压缩的图⽚,主
要⽤于互联⽹,数码产品,是⼀种流⾏最⼴的通⽤图⽚图像格式,JPEG图像是⼀种有损压缩格
式,所以⼀般⽂件都很⼩,适合于观看浏览。

PNG格式,是Portable Network Graphics 便携式⽹络图形的缩写,是⼀种⽆损压缩图⽚形格
式。

PNG格式主要⽤于⽹页设计,⽀持透明背景保存,⽐GIF透明图⽚拥有更多的⾊彩及透明度
层级,⽀持24位真彩。

TIFF格式,是 Tag Image File Format 标签图像⽂件格式的缩写,TIFF格式图⽚使⽤LZW⽆损
压缩算法,⼀般⽤于图⽚处理程序之间交换数据,主要应⽤于桌⾯印刷,排版设计等⾏业。

TIFF格式和 JPEG PNG相⽐较来说,最⼤的特点是TIFF可以带路径和图层保存图像。

Jpeg 解析

Jpeg 解析

如(0,2,3)中,0和2经过运算(0*16+2)被写成2 ,得到2和3两个Byte。
正因为这样,也带来了许多的问题。
首先,表示0行程的值只有4位(取值范围0~15),如果AC中(排在后面的63个)连续0的个数超过15个,就要写入一组(15,0,0),代表0的前面有15个0,加上本身一共有16个0,然后继续RLE编码。
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
我们接着上面举的例子来说明,写入文件的数依次是:
(6 35) (2 3)(19 3)(33 1)(EOB)
DC差异值 AC的REL编码
拿每组数字的前面的数字去查相对应的哈夫曼表,获得表值,写入文件。再把后面的数字按实际位数写入文件。注意,我这里讲的是相应的哈夫曼表,一个JPEG文件,一般要建立四个哈夫曼表(在后面的文件组成部分会讲到),分别是DC—Y—HT、 DC—UV—HT、 AC—Y—HT、 AC—UV—HT。因为DC和AC要分开,Y和UV也要分开。
我们假设上面举的例子中的流是Y(亮度)流为例,6为索引查DC—Y—HT得到表值14(长4位);2查 AC—Y—HT得到表值1(长2位);19查 AC—Y—HT得到表值121(长7位);33查 AC—Y—HT得到表值28(长5位);EOB是AC—Y—HT表中第一个(索引为0)的值0(长度2)。这样我们就得到了写入文件的数字流为:
(上一个下一个) (左一个右一个)
压缩格式:1:1:1 4:1:1 4:2:2 4:2:2
ቤተ መጻሕፍቲ ባይዱ
Y= 0.299 * R + 0.587 * G + 0.114 * B
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JPEG图像格式详解JPEG 压缩简介-------------1. 色彩模型JPEG 的图片使用的是 YCrCb 颜色模型, 而不是计算机上最常用的 RGB. 关于色彩模型, 这里不多阐述. 只是说明, YCrCb 模型更适合图形压缩. 因为人眼对图片上的亮度 Y 的变化远比色度 C 的变化敏感. 我们完全可以每个点保存一个 8bit 的亮度值, 每 2x2 个点保存一个 Cr Cb 值, 而图象在肉眼中的感觉不会起太大的变化. 所以, 原来用 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*B (亮度)Cb = - 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的倍数, 好一块块的处理. 另外, 记得刚才我说的 Cr Cb 都是 2x2 记录一次吗? 所以大多数情况, 是要补成 16x16 的整数块.按从左到右, 从上到下的次序排列 (和我们写字的次序一样). JPEG 里是对 Y Cr Cb 分别做 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 优化算法, 大家可以去 inet 自己找一下.在 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, 所以, 如果有这么一组数字:57, 十八个0, 3, 0, 0, 0, 0, 2, 三十三个0, 895, EOB我们实际这样编码:(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 编码为 111000 ( 06 对应 111000 为查表所得. jpeg 文件里保存了压缩时所产生的 huffman 表, 将 0~255 这 256 个 8 bits 定长数字, 对应成 1~16 bits 的不定长数值. 出现频率高的数字小于 8bits, 频率低的大于8bits,从而使整个的数据长度降低, 关于 huffman 压缩算法, 请查阅相关资料 )69 = (4,5) --- 1111111110011001 ( 注: 69=4*16+5=0x45 )21 = (1,5) --- 111111101104 = (0,4) --- 101133 = (2,1) --- 110110 = EOB = (0,0) --- 1010那么最后对于前面的例子表示的 63 个系数 (记得我们将第一个跳过了吗?) 按位流写入 JPG 文件中就是这样的:111000 111001 111000 101101 1111111110011001 10111 11111110110 00001 1011 0111 11011 1 10107. DC 的编码-----------记得刚才我们跳过了每组 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/2 4 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解码过程简述-------------8. 一个数据单元 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 或者处理到 64 个 ACa) 取得一个 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 到 RGB9. JPG 文件(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, 那么就用 0xFF0x00 代替. 就是说在 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 --...)-------10. 标记-------下面是必须处理的标记SOF0 = Start Of Frame 0 = FFC0SOS = Start Of Scan = FFDAAPP0 = it's the marker used to identify a JPG file which uses the JFIFspecification = FFE0COM = Comment = FFFEDNL = Define Number of Lines = FFDCDRI = Define Restart Interval = FFDDDQT = Define Quantization Table = FFDBDHT = Define Huffman Table = FFC411. JPG 文件中 Haffman 表的储存-----------------------------JPEG 里定义了一张表来描述 Haffman 树. 定义在 DHT 标记后面. 注意: Haffman 代码的长度限制在 16bit 内.一般一个 JPG 文件里会有 2 类 Haffman 表: 一个用于 DC 一个用于 AC (实际有 4 个表, 亮度的 DC,AC 两个, 色度的 DC,AC 两个)这张表是这样保存的:1) 16 字节:第 i 字节表示了 i 位长的 Huffman 代码的个数 (i= 1 到 16)2) 这表的长度 (字节数) = 这 16 个数字之和现在你可以想象这张表怎么存放的吧? 对应字节就是对应 Haffman 代码等价数字. 我不多解释, 这需要你先了解 Haffman 算法. 这里只举一个例子:Haffman 表的表头是 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等等...如果你懂 Haffman 编码, 这些不难理解12. 采样系数-----------下面讲解的都是真彩 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 个原始数据, 经过 RLE, 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) 标记后13. 简单说一下 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 段.。

相关文档
最新文档