长春做孕检哪家医院好:Jpeg文件的格式和解码

来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 17:46:12
Jpeg文件解码
==============
关于读文件,用到的API有CreateFile, CloseHandle, ReadFile。没有想过给这些API再做封装以便于以后的移植。不过倒是在做Huffman解码的时候,要以Bit为单位读,很是麻烦。最终决定,直接把文件全部读到内存里再解码,可谓一箭双雕。通常文件都不会超过10M,所以,即使对于手机来说,这也不是问题。
==============
Jpeg文件的标准是很复杂的,CCITT T.81就是一个关于jpeg的Recommendation。
CCITT: THE INTERNATIONAL TELEGRAPH AND TELEPHONE CONSULTATIVE COMMITTEE
TERMINAL EQUIPMENT AND PROTOCOLS FOR TELEMATIC SERVICES INFORMATION TECHNOLOGY – DIGITAL COMPRESSION AND CODING OF CONTINUOUS-TONE STILL IMAGES – REQUIREMENTS AND GUIDELINES Recommendation T.81
通常,jpeg文件遵循一个更小的规范,叫做Jpeg File Interchange Format。不过从我检验过的几个图片来看,对这个规范遵循得不很严格。JFIF是一个相对简单得多的规范。JFIF定义出的文件,是Jpeg文件的一个子集。
==============
Jpeg文件,是由段构成的,每个段的开始是两个Byte的Marker Assignment: 0xff和一个段类型。段类型不能是0xff,也不能是0x00。理由如下: 0xff00在压缩图像数据里面,表示一个0xff,以避免段的开始符号出现在图像数据里面。0xff可以填充在段间。
Code Assignment
Symbol
Description
Start Of Frame markers, non-differential, Huffman coding
X’FFC0’
X’FFC1’
X’FFC2’
X’FFC3’
SOF0
SOF1
SOF2
SOF3
Baseline DCT
Extended sequential DCT
Progressive DCT
Lossless (sequential)
Start Of Frame markers, differential, Huffman coding
X’FFC5’
X’FFC6’
X’FFC7’
SOF5
SOF6
SOF7
Differential sequential DCT
Differential progressive DCT
Differential lossless (sequential)
Start Of Frame markers, non-differential, arithmetic coding
X’FFC8’
X’FFC9’
X’FFCA’
X’FFCB’
JPG
SOF9
SOF10
SOF11
Reserved for JPEG extensions
Extended sequential DCT
Progressive DCT
Lossless (sequential)
Start Of Frame markers, differential, arithmetic coding
X’FFCD’
X’FFCE’
X’FFCF’
SOF13
SOF14
SOF15
Differential sequential DCT
Differential progressive DCT
Differential lossless (sequential)
Huffman table specification
X’FFC4’
DHT
Define Huffman table(s)
Arithmetic coding conditioning specification
X’FFCC’
DAC
Define arithmetic coding conditioning(s)
Restart interval termination
X’FFD0’ through X’FFD7’
RSTm *
Restart with modulo 8 count “m”
Other markers
X’FFD8’
X’FFD9’
X’FFDA’
X’FFDB’
X’FFDC’
X’FFDD’
X’FFDE’
X’FFDF’
X’FFE0’ through X’FFEF’
X’FFF0’ through X’FFFD’
X’FFFE’
SOI*
EOI*
SOS
DQT
DNL
DRI
DHP
EXP
APPn
JPGn
COM
Start of image
End of image
Start of scan
Define quantization table(s)
Define number of lines
Define restart interval
Define hierarchical progression
Expand reference component(s)
Reserved for application segments
Reserved for JPEG extensions
Comment
Reserved markers
X’FF01’
X’FF02’ through X’FFBF’
TEM*
RES
For temporary private use in arithmetic coding Reserved
有的段是只有0xff??,没有数据的。这样的段在上面的表里面加了*。
其他的段在Marker Assignment的后面都是一个Marker Segment。Marker Segment的前两个字节是段长度: lengthHighByte和lengthLowByte。长度包括这两个字节,但是不包括Marker Assignment。
=============
JFIF的规定是这样的:
1) 图像以SOI开始;
2) 一个APP0段,包含基本的图像信息和可选的缩略图;
3) 若干个可选的APPn段;
4) 若干个DQT段,各个通道的量化表,每个段可以包含多个量化表;
5) 一个SOF0段,图像的尺寸,每个通道的采样率和量化表号都在这里;
6) 若干个DHT段,定义每个通道的huffman编码表,每个通道分AC,DC两个表,每个段可以包含多个Huffman表;
7) 一个SOS段,包含每个通道用的huffman编码表的标号信息,这个段后面不是一个段,而是压缩图像数据,数据中可能会插入RST,不过一定是插在MCU之间的,不会出现在MCU中;(大部分jpg图像都没有RST的,不过photoshop产生的图像里面有大量的RST)
8) 图像以EOI结束。
写了一个程序读jpeg文件里面的段信息:实验的结果是,大部分jpeg图像基本上符合JFIF,图像编码用的是non-differential Huffman-coding 的 Baseline DCT,就是说SOF只有SOF0。有的文件没有APP0段。有的文件DHT在SOS前面。有的文件在SOS前面还有DRI。压缩图像数据部分,MCU内部都没有段出现。最符合标准的是Windows XP的画图产生的jpeg文件。
=============
JPEGsnoop是个解析jpeg文件的不错的工具。
评论这张
转发至微博