概述
图片存储格式之一,由 JPEG格式衍生而来,后缀为".jfif"。
JPEG本身只有描述如何将一个 图像转换为 字节的数据 串流(streaming),但并没有说明这些字节如何在任何特定的储存媒体上被封存起来。一个由独立JPEG小组(Independent JPEG Group)所建立的额外标准,称为JFIF(JPEG File Interchange Format,JPEG档案交换格式),详细说明如何从一个JPEG串流,产出一个适合于电脑储存和传输(像是在因特网上)的档案。当有人称呼一个"JPEG档案",一般而言他是意指一个JFIF档案,或有时候是一个Exif JPEG档案。然而,也有其他以JPEG为基础的档案格式,像是JNG。
JPEG/JFIF是最普遍在 万维网(World Wide Web)上被用来储存和传输图片的格式。它并不适合于线条绘图(drawing)和其他文字或图示(iconic)的图形,因为它的 压缩方法用在这些图形的型态上,会得到不适当的结果( PNG和 GIF格式通常是用来针对这种目的之图形;GIF每一像素只有8位元,并不很适合于用在彩色照片,PNG可以被用来无失真地储存照片,但是档案太大让它不适合在网页上放照片)。
对于JFIF的MIME媒体型态是image/ jpeg(定义在RFC 1341)。
2简介
微处理机中的数据存放顺序有 大端(big endian)小端(little endian)
[1] 之分。 大端顺序是指高 字节数据存放在低地址处,低 字节数据存放在高地址处,而小端顺序是指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处。例如, 十六进制数为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文件使用的颜色空间是YCbCr空间。在JFIF文件格式中, 图像样本的存放顺序是从左到右和从上到下。这就是说JFIF文件中的第一个 图像样本是图像左上角的样本。
3文件结构
JFIF 文件格式直接使用JPEG标准为应用程序定义的许多标记,因此JFIF格式成了事实上JPEG文件交换格式标准。JPEG的每个标记都是由2个 字节组成,其前一个字节是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充 字节(fill byte)。下面是其中的8个标记:
SOI 0xD8 图像开始
APP0 0xE0 JFIF应用数据块
APPn 0xE1 - 0xEF 其他的应用 数据块(n, 1~15)
DQT 0xDB 量化表
SOF0 0xC0 帧开始
DHT 0xC4 霍夫曼(Huffman)表
SOS 0xDA 扫描线开始
EOI 0xD9 图像结束
一般的JFIF文件由下面的9个部分组成:
(1) 图像开始SOI(Start of Image)标记 0h 2 字节 0xFFD8
(2)
APP0标记(Marker) 0h 2 字节 0xFFE0
① APP0长度(length)(①~⑨九个字段的总长度)
2h 2 字节内容不定(①~⑨九个字段的总长度)
② 标识符(identifier)
4h 5 字节 0x4A46494600 即“JFIF0”
③ 版本号(version)
9h 2 字节 0x0102 JFIF的版本号目前基本上都是1.2
④ X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)
bh 1 字节只有0,1,2三个值可选,其分别代表的意义如上]
⑤ X方向像素密度(X density)
ch 2 字节取值范围未知
⑥ Y方向像素密度(Y density)
eh 2 字节取值范围未知
⑦ 缩略图水平像素数目(thumbnail horizontal pixels)
10h 1 字节取值范围未知
⑧ 缩略图垂直像素数目(thumbnail vertical pixels)
11h 1 字节取值范围未知
⑨ 缩略图RGB 位图(thumbnail RGB bitmap)
12h 长度可能是3的倍数内容不定
本段(APP0)可以包含 图像的一个微缩版本,存为24位的RGB像素。如果没有微缩 图像(这种情况更常见),则⑦“缩略图水平像素数目”和⑧“缩略图垂直像素数目”的值均为0。
(3)
APPn标记(Markers)
① APPn长度(length)(①②两个字段的总长度)
② 详细信息(application specific information)
对每个APP:
若为APPN(N=1~F(以16进制表示,N任选其中一个))
・ 标记: mh 2 字节 0xFFEN
・ 长度:(m+2)h 2 字节内容不定(设为n(10进制))(本字段与下一字段的总长度)
・ 详细信息: (m+4)h n-2 字节(即长度减2)内容不定
(4)
一个或者多个量化表DQT(Difine Quantization Table) 0h 2字节 0xFFDB
① 量化表长度(quantization table length)(①~②两个字段的总长度)
2h 2字节内容不定(①~②两个字段的总长度)
② 量化表(quantization table)
A. P/T(高四位:精度,低四位:表ID)
B. 表项
对每个量化表:
・ P/T(高四位:精度,低四位:表ID) mh 1 字节精度, 0 表示 8 bit, 1表示 16 bit;ID取值范围为0~3, 否则错误
・ 表项 (m+1)h (64×(精度+1)) 字节内容长,故略
(5) 帧 图像开始SOF0(Start of Frame)
0h 2字节 0xFF
C0
① 帧开始长度(start of frame length) (①~⑥六个字段的总长度)
2h 2 字节内容不定(①~⑥六个字段的总长度)
② 精度(precision),每个颜色分量每个像素的位数(bits per pixel per color component)
4h 1 字节每个样本位数, 通常是 8 (大多数软件不支持 12 和 16)
③ 图像高度(image height) 5h 2 字节内容不定(如果不支持 DNL 就必须 >0)
④ 图像宽度(image width) 7h 2 字节内容不定(如果不支持 DNL 就必须 >0)
⑤ 颜色分量数(number of color components)
9h 1 字节内容不定(灰度图是 1, YCbCr/YIQ 彩色图是 3, CMYK 彩色图是 4,我们这里讨论的JFIF使用的是YCbCr,故这里颜色分量数为3)
⑥ 对每个颜色分量(for each component)
A. ID
B. 垂直方向的样本因子(vertical sample factor)
C. 水平方向的样本因子(horizontal sample factor) B、C共占用1 字节,B占用低4位,C占用高4位)
D. 量化表号(quantization table#)
JFIF格式使用的是YCbCr所以有3个分量(这里特别要注意的是颜色分量的ID号是有含义的,1代表Y,2代表Cb,3代表Cr,4代表I,5代表Q):
1) ID
ah 1 字节 0x01
(高四位)水平(低四位)垂直样本因子
bh 共1 字节 0x227
量化表号
ch 1 字节内容不定(本分量使用的量化表的ID号)
2) ID
dh 1 字节 0x02
(高四位)水平(低四位)垂直样本因子
eh 共1 字节 0x11J
量化表号
fh 1 字节内容不定(本分量使用的量化表的ID号)
3) ID
10h 1 字节 0x03
(高四位)水平(低四位)垂直样本因子
11h 共1 字节 0x11
量化表号
12h 1 字节内容不定(本分量使用的量化表的ID号)
(6)
一个或者多个霍夫曼表DHT(Difine Huffman Table)
0h 2字节 0xFF
C4
① 霍夫曼表的长度(Huffman table length) (①~②两个字段的总长度)
2h 2字节内容不定(①~②两个字段的总长度)
② 对每个霍夫曼表(一般情况下,霍夫曼表不止一个,但是绝对不多于4个)
A. 表号
B. 类型:AC或者DC(其中0:DC表,1:AC表);A、B共占用1 字节,A占用低4位,B占用高4位)
C. 长16个 字节的编码,其代码代数和为接下来的编码的长度
D. 内容编码
对每个霍夫曼表:
・(高四位)类型和(低四位)表号: mh 共1 字节内容不定(有四个可能:0x00表示第0个DC表,0x01表示第1个DC表,0x10表示第0个AC表,0x11表示第1个AC表)
・ 长16个 字节的编码: (m+1)h 16字节内容不定(设这16个字节上数据之和为n)
・ 内容编码: (m+17)h n 字节内容长,故略)
(7)
定义重新开始间隔DRI(Define Restart Interval)
(在没有DRI标记,或间隔为零时,就不存在重新开始间隔和重开始标记)
0h 2字节 0xFF
DD
① 长度 2h 2字节 0x0004(①~②两个字段的总长度)
② MCU 块的单元中的重新开始间隔
4h 2 字节内容不定(设为n,则意思是说,每n个MCU块就有一个RSTn标记。第一个标记是RST0,然后是RST1等,RST7后再从RST0重复)
(8)
扫描开始SOS(Start of Scan)
0h 2字节 0xFF
DA
① 扫描开始长度(start of scan length)
2h 2字节内容不定(①~③再加上④的A\B\C的总长度)
② 颜色分量数(number of color components)
4h 1 字节应该和⑸⑤的值相同(灰度图是1, YCbCr/YIQ 彩色图是3, CMYK 彩色图是4)
③ 每个颜色分量
A. ID
B. 交流系数表号(AC table #)
C. 直流系数表号(DC table #)
(B、C共占用1 字节,B:占用低4位,C:占用高4位)
由②得到这里的颜色分量数为3(这里的颜色分量的ID号的含义和⑸⑥的一样,1代表Y,2代表Cb,3代表Cr,4代表I,5代表Q):
1) ID
5h 1 字节 0x01 (高四位)直流(低四位)交流数表号
6h 共1 字节 0x00
2) ID
7h 1 字节 0x027 (高四位)直流(低四位)交流数表号
8h 共1字节 0x11
3) ID
9h 1 字节 0x03 (高四位)直流(低四位)交流数表号
ah 共1字节 0x11
④ 压缩 图像数据(compressed image data)
A. 谱选择开始 bh 1 字节 0x00
B. 谱选择结束 ch 1 字节 0x3F
C. 两个4位字段,高位和低位的谱选择 dh 1 字节在基本JPEG中总为0x00
D. 数据 eh 长度不定内容长,故略
(9) 图像结束EOI(End of Image)
0h 2字节 0xFF
D9