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文件格式标准的基本知识,包括其历史背景、文件结构、压缩算法以及应用领域。

通过深入理解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的频率系数矩阵(所谓频率就是颜⾊改变的速度),频率系数都是浮点数。

③量化:由于下⾯第四步编码过程中使⽤的码本都是整数,因此要对频率系数进⾏量化,将之转换为整数。

数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这⼀差异是造成图像压缩后失真的主要原因。

这⼀过程中,质量因⼦的选取⾄为重要。

值选得⼤,可以⼤幅度提⾼压缩⽐,但是图像质量就⽐较差,质量因⼦越⼩图像重建质量越好,但是压缩⽐越低。

④编码:编码是基于统计特性的⽅法。

  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.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段.。

相关文档
最新文档