1、JPEG图片格式简单分析对于花花绿绿色彩斑斓的图片,也许里面包含了艺术家的许多心血,但归根结底它就是一个文件,里面写满了16进制代码的一个文件,这些代码的前面一部分可能是介绍了这张图片的一些简单的信息,后面一大部分是它的图像数据。这个文件的原理简单的就像是一篇小论文,题目,摘要,关键词,正文,参考文献等,那么这篇小论文的具体格式到底是什么呢?其实很简单,用ultraEdit随便打开一张jpg格式的图片就可以看到,但是要看懂里面的内容也不是一件很容易的事情,那么先看下面转载的这篇文章吧,看完它就会很容易理解JPG的文件格式了。JPEG 图片格式简单分析 1、基本常识 微处理机中的存放顺序有正序(
2、big endian)和逆序(little endian)之分。正序存放就是高字节存放在前低字节在后,而逆序存放就是低字节在前高字节在后。例如,十六进制数为A02B,正序存放就是A02B,逆序存放就是2BA0。摩托罗拉(Motorola)公司的微处理器使用正序存放,而英特尔(Intel)公司的微处理器使用逆序。JPEG文件中的字节是按照正序排列的。 JPEG委员会在制定JPEG标准时,定义了许多标记(marker)用来区分和识别图像数据及其相关信息,但笔者没有找到JPEG委员会对JPEG文件交换格式的明确定义。直到1998年12月从分析网上具体的JPG图像来看,使用比较广泛的还是JPEG文件交
3、换格式(JPEG File Interchange Format,JFIF)版本号为1.02。这是1992年9月由在C-Cube Microsystems公司工作的Eric Hamilton提出的。此外还有TIFF JPEG等格式,但由于这种格式比较复杂,因此大多数应用程序都支持JFIF文件交换格式。 JPEG文件使用的颜色空间是CCIR 601推荐标准进行的彩色空间(参看第7章)。在这个彩色空间中,每个分量、每个像素的电平规定为255级,用8位代码表示。从RGB转换成YCbCr空间时,使用下面的精确的转换关系: Y = 256 * Ey Cb = 256 * ECb + 128 Cr = 2
4、56 * ECr + 128其中亮度电平Ey和色差电平ECb和ECb分别是CCIR 601定义的参数。由于Ey的范围是01,ECb和ECb的范围是-0.5+0.5,因此Y, Cb和Cr的最大值必须要箝到255。于是RGB和YCbCr之间的转换关系需要按照下面的方法计算。 (1) 从RGB转换成YCbCr YCbCr(256级)分量可直接从用8位表示的RGB分量计算得到: Y = 0.299 R + 0.587G + 0.114 B Cb = - 0.1687R - 0.3313G + 0.5B + 128 Cr = 0.5 R - 0.4187G - 0.0813 B + 128 需要注意的是
5、不是所有图像文件格式都按照R0,G0,B0, Rn,Gn,Bn的次序存储样本数据,因此在RGB文件转换成JFIF文件时需要首先验证RGB的次序。 (2) 从YCbCr转换成RGB RGB分量可直接从YCbCr(256级)分量计算得到: R = Y + 1.402 (Cr-128) G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128) B = Y + 1.772 (Cb-128) 在JFIF文件格式中,图像样本的存放顺序是从左到右和从上到下。这就是说JFIF文件中的第一个图像样本是图像左上角的样本。 2 文件结构 JFIF文件格式直接使用JPEG标准为应用程序定
6、义的许多标记,因此JFIF格式成了事实上JPEG文件交换格式标准。JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个标记: 1. SOI 0xD8 图像开始 2. APP0 0xE0 JFIF应用数据块 3. APPn 0xE1 - 0xEF 其他的应用数据块(n, 115) 4. DQT 0xDB量化表 5. SOF0 0xC0 帧开始 6. DHT 0xC4霍夫曼(Huffman)表 7. SOS 0xDA扫描线开始 8. EOI 0xD9 图像结束 为使读者对JPEG定义的标记一目了
7、然,现将JPEG的标记码列于表6-05,并保留英文解释。 表6-05 JPEG定义的标记Symbol (符号)Code Assignment (标记代码)Description (说明)Start Of Frame markers, non-hierarchical Huffman codingSOF00xFFC0 Baseline DCTSOF10xFFC1Extended sequential DCTSOF20xFFC2Progressive DCTSOF30xFFC3Spatial (sequential) lossless Start Of Frame markers, hierarc
8、hical Huffman coding SOF50xFFC5 Differential sequential DCTSOF60xFFC6Differential progressive DCT SOF7 0xFFC7Differential spatial losslessStart Of Frame markers, non-hierarchical arithmetic coding JPG0xFFC8Reserved for JPEG extensions SOF90xFFC9Extended sequential DCT SOF10 0xFFCAProgressive DCTSOF1
9、1 0xFFCBSpatial (sequential) LosslessStart Of Frame markers, hierarchical arithmetic codingSOF130xFFCDDifferential sequential DCTSOF140xFFCEDifferential progressive DCTSOF150xFFCFDifferential spatial Lossless Huffman table specification DHT0xFFC4Define Huffman table(s)arithmetic coding conditioning
10、specification DAC 0xFFCCDefine arithmetic conditioning table Restart interval termination RSTm0xFFD00xFFD7 Restart with modulo 8 counter m Other marker SOI0xFFD8 Start of image EOI0xFFD9End of imageSOS 0xFFDA Start of scanDQT 0xFFDB Define quantization table(s)DNL0xFFDCDefine number of lines DRI0xFF
11、DDDefine restart intervalDHP 0xFFDEDefine hierarchical progression EXP0xFFDF Expand reference image(s) APPn0xFFE00xFFEFReserved for application useJPGn0xFFF00xFFFDReserved for JPEG extension COM 0xFFFECommentReserved markers TEM0xFF01For temporary use in arithmetic coding RES 0xFF020xFFBF Reserved J
12、PEG文件由下面的8个部分组成: (1) 图像开始SOI(Start of Image)标记 (2) APP0标记(Marker) APP0长度(length) 标识符(identifier) 版本号(version) X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米) X方向像素密度(X density) Y方向像素密度(Y density) 缩略图水平像素数目(thumbnail horizontal pixels) 缩略图垂直像素数目(thumbnail vertical pixels) 缩略图RGB位图(thumbnail RGB bit
13、map) (3) APPn标记(Markers),其中n=115(任选) APPn长度(length) 由于详细信息(application specific information) (4) 一个或者多个量化表DQT(difine quantization table) 量化表长度(quantization table length) 量化表数目(quantization table number) 量化表(quantization table) (5) 帧图像开始SOF0(Start of Frame) 帧开始长度(start of frame length) 精度(precision),
14、每个颜色分量每个像素的位数(bits per pixel per color component) 图像高度(image height) 图像宽度(image width) 颜色分量数(number of color components) 对每个颜色分量(for each component) ID 垂直方向的样本因子(vertical sample factor) 水平方向的样本因子(horizontal sample factor) 量化表号(quantization table#) (6) 一个或者多个霍夫曼表DHT(Difine Huffman Table) 霍夫曼表的长度(Huff
15、man table length) 类型、AC或者DC(Type, AC or DC) 索引(Index) 位表(bits table) 值表(value table) (7) 扫描开始SOS(Start of Scan) 扫描开始长度(start of scan length) 颜色分量数(number of color components) 每个颜色分量 ID 交流系数表号(AC table #) 直流系数表号(DC table #) 压缩图像数据(compressed image data) (8) 图像结束EOI(End of Image)表6-06表示了APP0域的详细结构。有兴趣
16、的读者可通过UltraEdit或者PC TOOLS等工具软件打开一个JPG图像文件,对APP0的结构进行分析和验证。 表6-06 JFIF格式中APP0域的详细结构偏移长度 内容块的名称说明02 byte0xFFD8 (Start of Image,SOI) 图像开始22 byte 0xFFE0APP0(JFIF application segment) JFIF应用数据块42 bytes length of APP0 blockAPP0块的长度 65 bytes JFIF+0识别APP0标记 11 1 byte 主要版本号(如版本1.02中的1) 12 1 byte 次要版本号(如版本1.0
17、2中的02) 13 1 byte X和Y的密度单位 units=0:无单位 units=1:点数/英寸 units=2:点数/厘米142 bytes 水平方向像素密度 162 bytes 垂直方向像素密度18 1 byte 缩略图水平像素数目 191 byte 缩略图垂直像素数目 3n 缩略RGB位图(n为缩略图的像素数) Optional JFIF extension APP0 marker segment(s) 任选的JFIF扩展APP0标记段 2 byte 0xFFD9 (EOI) end-of-file图像文件结束标记JPEG图像大多都使用JFIF格式JPEG文件交换格式(JPEG F
18、ile Interchange Format,JFIF),现在JFIF格式已经成为JPEG文件交换格式标准。JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个标记:SOI 0xD8 图像开始APP0 0xE0JFIF应用数据块APPn 0xE1 0xEF其他的应用数据块(n, 115)DQT 0xDB 量化表SOF0 0xC0帧开始DHT 0xC4 霍夫曼(Huffman)表SOS 0xDA 扫描线开始EOI 0xD9 图像结束SOI = Start Of Image = FFD8DQT
19、= Define Quantization Table = FFDBAPP0 = the marker used to identify a JPG file which uses the JFIF specification = FFE0COM = Comment = FFFEDNL = Define Number of Lines = FFDCSOF0 = Start Of Frame 0 = FFC0DRI = Define Restart Interval = FFDDDHT = Define Huffman Table = FFC4SOS = Start Of Scan = FFDA
20、EOI = End Of Image = FFD9段的类型:SOF0: Start Of Frame 0:FFC0 $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
21、 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:FFDD $ff, $dd (DRI) 长度 (高字节, 低字节), 必须是 4 MCU 块的单元中的重新开始间隔 (高字节, 低字节), 意思是说, 每 n 个 MCU 块就有一个 RSTn 标记. 第一个标记是 RST0, 然后是 RST1 等, RST7 后再从 RST0 重复DQT: Define Quantization T
22、able:FFDB $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: D
23、efine Huffman Table:FFC4 $ff, $c4 (DHT) 长度 (高字节, 低字节) HT 信息 (1 byte): bit 0.3: HT 号 (0.3, 否则错误) bit 4 : HT 类型, 0 = DC table, 1 = AC table bit 5.7: 必须是 0 16 bytes: 长度是 1.16 代码的符号数. 这 16 个数的和应该 = 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 段.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1