JPEG文件格式简单分析.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:
这篇文章大体上介绍了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图片的信息片断:
SOI
APP0 Length: 0x10
DQT
DQT [0]:
8 6 5 8 12 20 26
31
6 6
7 10 13 29 30
28
7 7 8 12 20 29 35
60
7 9 11 15 26 44 50
31
9 11 19 28 34 56 52 0
12 18 28 32 61 52 0
46
25 32 39 57 52 0 60 0
36 46 39 49 253 50 0
50
Length: 0x43
DQT
DQT [1]:
9 9 12 24 50 50 50
50
9 11 13 33 50 50 50
50
12 13 28 50 50 50 50
50
24 33 50 50 50 50 50
50
50 50 50 50 50 50 50 0
50 50 50 50 50 50 0
50
50 50 50 50 50 0 50 0
50 50 50 50 253 50 0 50
Length: 0x43
SOF0
Image Height: 173
Image Width: 401
Number of Frame(s): 3
****************
Content ID: 1
H Factor: 2
V Factor: 2
QT ID: 0
****************
Content ID: 2
H Factor: 1
V Factor: 1
QT ID: 1
****************
Content ID: 3
H Factor: 1
V Factor: 1
QT ID: 1
Length: 0x11
DHT
Type: DC TABLE
ID: 0
Length: 0x1f
DHT
Type: AC TABLE
ID: 0
Length: 0xb5
DHT
Type: DC TABLE
ID: 1
Length: 0x1f
DHT
Type: AC TABLE
ID: 1
Length: 0xb5
SOS Length: 0xc <-Will Not Process This Seg.
FATAL ERROR: File Structure Does NOT Support.
你首先会想到为什么最后会出现一个错误的信息呢?这是因为,在SOS (Start Of Scan)段的后面,就是编码后的一行一行的图像信息。不再是段的结构了。在开始的SOI(Start Of Image)不是一个段,它是文件的开始,它的值也是类似于0xFF,0xXX的结构(SOI的具体数值清自己察看相关书籍,本文章中将不作重点介绍),但是后面没有段的长度。在文件的最后,有一个EOI(End Of Image)的标识,它的结构和SOI是类似的。它标志着文件的结束。
在这中间,包含了APP0段,DQT段,SOF0段,DHT段,SOS段。有的段的个数是不唯一的,比方说DQT段。我们现在重点地介绍各个段的作用。
三、JPEG文件中段的介绍:
APP0段中主要存储的是图片的识别信息(字符串”JFIF\0”)、一些分辨率的信息以及缩略图的信息。在我的实际测试中,发现并不是所有的JPEG 文件都有APP0段的,有的仅是有APP2之类的其他段,但是每个文件中肯定是包含APPX的段(X可以取得的值可以查阅相关文档)。我个人估计,这些APPX的段的信息应该是大同小异。这个的验证还有待本人进一步的学习,目前只能说到这里。
DQT段的内容是量化表的信息。众所周知,一个颜色可以分为RGB(红、绿、兰)三个分量,这三色光组成了我们可以见到的所有色彩。但是,在JPEG 文件中,RGB色彩格式需要先转化为YUV的格式。Y分量代表了亮度信息,UV分量代表了色差信息。相比之下,人眼对于Y分量更为敏感。量化表的作用就是对于一些不需要的量进行去除,这也是JPEG有损压缩损失数据的