三、附:JPEG 文件格式
- 文件头 (2 bytes): $ff, $d8 (SOI) (JPEG 文件标识) - 任意数量的段 , 见后面 - 文件结束 (2 bytes): $ff, $d9 (EOI)
段的格式:
- header (4 bytes): $ff 段标识 n 段的类型 (1 byte) sh, sl 该段长度, 包括这两个字节, 但是不包括前面的 $ff 和 n. 注意: 长度不是 intel 次序, 而是 Motorola 的, 高字节在前, 低字节在后! - 该段的内容, 最多 65533 字节
注意:
- 有一些无参数的段 (下面那些前面注明星号的) 这些段没有长度描述 (而且没有内容), 只有 $ff 和类型字节. - 段之间无论有多少 $ff 都是合法的, 必须被忽略掉.
段的类型:
*TEM = $01 可以忽略掉
SOF0 = $c0 帧开始 (baseline JPEG), 细节附后 SOF1 = $c1 dito SOF2 = $c2 通常不支持 SOF3 = $c3 通常不支持
SOF5 = $c5 通常不支持 SOF6 = $c6 通常不支持 SOF7 = $c7 通常不支持
SOF9 = $c9 arithmetic 编码(Huffman 的一种扩展算法), 通常不支持 SOF10 = $ca 通常不支持 SOF11 = $cb 通常不支持
SOF13 = $cd 通常不支持 SOF14 = $ce 通常不支持 SOF14 = $ce 通常不支持 SOF15 = $cf 通常不支持
DHT = $c4 定义 Huffman Table, 细节附后 JPG = $c8 未定义/保留 (引起解码错误) DAC = $cc 定义 Arithmetic Table, 通常不支持
*RST0 = $d0 RSTn 用于 resync, 通常被忽略 *RST1 = $d1 *RST2 = $d2 *RST3 = $d3 *RST4 = $d4 *RST5 = $d5 *RST6 = $d6 *RST7 = $d7
SOI = $d8 图片开始 EOI = $d9 图片结束 SOS = $da 扫描行开始, 细节附后 DQT = $db 定义 Quantization Table, 细节附后 DNL = $dc 通常不支持, 忽略 DRI = $dd 定义重新开始间隔, 细节附后 DHP = $de 忽略 (跳过) EXP = $df 忽略 (跳过)
APP0 = $e0 JFIF APP0 segment marker (细节略) APP15 = $ef 忽略
JPG0 = $f0 忽略 (跳过) JPG13 = $fd 忽略 (跳过) COM = $fe 注释, 细节附后
其它的段类型都保留必须跳过
SOF0: Start Of Frame 0:
- $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 - 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:
- $ff, $dd (DRI) - 长度 (高字节, 低字节), 必须是 4 - MCU 块的单元中的重新开始间隔 (高字节, 低字节), 意思是说, 每 n 个 MCU 块就有一个 RSTn 标记. 第一个标记是 RST0, 然后是 RST1 等, RST7 后再从 RST0 重复
DQT: Define Quantization Table:
- $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: Define Huffman Table:
- $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 个数的和应该 <=256 - n bytes: 一个包含了按递增次序代码长度排列的符号表 (n = 代码总数)
备注: - 一个单独的 DHT 段可以包含多个 HT, 每个都有自己的信息字节
COM: 注释:
- $ff, $fe (COM) - 注释长度 (高字节, 低字节) = L+2 - 注释为长度为 L 的字符流
SOS: Start Of Scan:
- $ff, $da (SOS) - 长度 (高字节, 低字节), 必须是 6+2*(扫描行内组件的数量) - 扫描行内组件的数量 (1 byte), 必须 >= 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 段.
出处:云风工作室
责任编辑:moby
上一页 JPEG 简易文档 V2.14 [3] 下一页
◎进入论坛网络编程版块参加讨论
|