JPEG

SOI,Start of Image,图像开始,2字节,固定值0xFFD8

JEPG APP0 应用程序保留标记0

字段名称 字段长度 Comments
标记代码 marker 2 bytes 固定值0xFF, 0xE0
数据长度 length 2 bytes APP0总长度,不过括marker,但是包括length本身
标识符 identifier 5 bytes 固定的字符串"JFIF\0"
版本号 version 2 bytes 一般为0x0101或者0x0102,表示JFIF的版本号1.2
像素单位 unit 1 bytes 坐标单位,0没有单位; 1 pixel/inch;2 pixel/cm
水平像素数目 Xdensity 2 bytes 取值范围未知
垂直像素数目 YDensity 2 bytes 取值范围未知
缩略图水平像素数目 1 byte 取值范围未知
缩略图垂直像素数目 1 byte 取值范围未知
缩略图RGB位图 3n bytes n = Xthumbnail * Ythumbnail, 这是一个24bits/piexl的RGB位图 如果没有微缩图像(这种情况更常见),则字段“缩略图水平像素数目”和字段“缩略图垂直像素数目”的值均为0。

APPn 应用程序保留标记

字段名称 字段长度 Comments
标记代码 marker 2 bytes 固定值0xFFE1 ~ 0xFFEF, n=1~15
数据长度 length 2 bytes APPn的总长度,不包括marker的2 bytes
详细信息 (length - 2) bytes 内容是应用特定的。 比如Exif使用APP1来存放图片的metadata; Adobe Photoshop用APP1和APP13两个标记段分别存储了一副图像的副本。

DQT DefineQuantization Table

字段名称 子字段 字段长度 Comments
标记代码 marker 2 bytes 固定值0xFF, 0xDB
量化表长度 length 2 bytes DQT的总长度,不包括marker的2bytes
量化表 (length-2)bytes 可以重复出现,表示多个量化表,但最多只能出现4次。
精度及量化表ID 1 bytes 高4位:精度,只有两个可选值,0:8bits,1:16bits; 低4位:量化表ID,取值范围为0~3
表项 (64*(精度+1)) bytes 例如8位精度的量化表,其表项长度为64×(0+1)=64字节

JPEG Start ofFrame marker结构,帧图像开始

字段名称 长度 Comments
标记代码 2 bytes 固定值0xFFC0
数据长度 2 bytes SOF marker长度,包括长度自身但不包含标记代码
精度 1 bytes 每个样本数据的位数,通常是8位,一般软件都不支持12位和16位
图像高度 2 bytes 图像高度,单位:像素
图像宽度 2 bytes 图像宽度,单位:像素
颜色分量数 1 bytes 3个数值可选1:灰度图; 3:YCrCb或YIQ; 4:CMYK JFIF中使用YCrCb,故这里颜色分量数恒为3
颜色分量信息 颜色分量数x3 每个颜色分量: 1 byte颜色分量ID; 1 byte水平/垂直采样因子。高4位:水平采样因子,低4位:垂直采样因子。 1 byte 当前分量使用的量化表ID

DHT,Difine HuffmanTable,定义哈夫曼表

字段名称 长度 Comments
标记代码 2 bytes 固定值0xFFC4
数据长度 2 bytes 包括长度自身但不包含标记代码
哈夫曼表 数据长度-2 bytes 出现1~4次。 例如,Adobe Photoshop 生成的JPEG图片文件中只有1个DHT标记段,里边包含了4个哈夫曼表; Macromedia Fireworks生成的JPEG图片文件则有4个DHT标记段,每个DHT标记段只有一个哈夫曼表。
1 bytes 表ID和表类型 高4位:类型,只有两个值可选 0:DC直流;1:AC交流 低4位:哈夫曼表ID, 注意,DC表和AC表分开编码
16 bytes 不同位数的码字数量
16个不同位数的码字数量之和(字节) 编码内容

DRI,Define Restart Interval,定义差分编码累计复位的间隔

字段名称 长度 Comments
标记代码 2 bytes 固定值0xFFDD
数据长度 2 bytes 固定值0x0004
MCU块的单元中的重新开始间隔 2 bytes 设其值为n,则表示每n个MCU块就有一个RSTn标记。 第一个标记是RST0,第二个是RST1等,RST7后再从RST0重复。 如果没有本标记段,或间隔值为0时,就表示不存在重开始间隔和标记RST。

MCU,Minimum Coded Unit,最小编码单元,通常是8x8,8x16或16x16。

JPEG Startof Scan。扫描开始

字段名成 长度 Comments
标记代码 2 bytes 固定值0xFFDA
数据长度 2 bytes SOS长度,包括长度自身
颜色分量数 1 bytes SOF中的字段值相同,即: 1:灰度图; 3: YCrCb或YIQ; 4:CMYK。 JFIF中使用YCrCb,故这里颜色分量数恒为3。
颜色分量信息 颜色分量数x3 每个样色分量: 1 byte 颜色分量ID; 1 byte直流/交流系数表号。高4位:直流分量使用的哈夫曼树编号;低4位:交流分量使用的哈夫曼树编号
压缩图像数据 3 bytes
1 byte 谱选择开始固定为0x00
1 byte 谱选择结束固定为0x3f
1 byte 谱选择 在basic JPEG中总为00

SOS标记之后紧接着就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束,一般就是以EOI标记表示结束。

EOI,End of Image,图像结束。2字节。固定值0xFFD9。