| 三、附: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] 下一页 ◎进入论坛网络编程版块参加讨论
	      |