三、附:JPEG 文件格式
- 文件頭 (2 bytes): $ff, $d8 (SOI) (JPEG 文件標(biāo)識) - 任意數(shù)量的段 , 見后面 - 文件結(jié)束 (2 bytes): $ff, $d9 (EOI)
段的格式:
- header (4 bytes): $ff 段標(biāo)識 n 段的類型 (1 byte) sh, sl 該段長度, 包括這兩個字節(jié), 但是不包括前面的 $ff 和 n. 注意: 長度不是 intel 次序, 而是 Motorola 的, 高字節(jié)在前, 低字節(jié)在后! - 該段的內(nèi)容, 最多 65533 字節(jié)
注意:
- 有一些無參數(shù)的段 (下面那些前面注明星號的) 這些段沒有長度描述 (而且沒有內(nèi)容), 只有 $ff 和類型字節(jié). - 段之間無論有多少 $ff 都是合法的, 必須被忽略掉.
段的類型:
*TEM = $01 可以忽略掉
SOF0 = $c0 幀開始 (baseline JPEG), 細節(jié)附后 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, 細節(jié)附后 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 圖片結(jié)束 SOS = $da 掃描行開始, 細節(jié)附后 DQT = $db 定義 Quantization Table, 細節(jié)附后 DNL = $dc 通常不支持, 忽略 DRI = $dd 定義重新開始間隔, 細節(jié)附后 DHP = $de 忽略 (跳過) EXP = $df 忽略 (跳過)
APP0 = $e0 JFIF APP0 segment marker (細節(jié)略) APP15 = $ef 忽略
JPG0 = $f0 忽略 (跳過) JPG13 = $fd 忽略 (跳過) COM = $fe 注釋, 細節(jié)附后
其它的段類型都保留必須跳過
SOF0: Start Of Frame 0:
- $ff, $c0 (SOF0) - 長度 (高字節(jié), 低字節(jié)), 8+components*3 - 數(shù)據(jù)精度 (1 byte) 每個樣本位數(shù), 通常是 8 (大多數(shù)軟件不支持 12 和 16) - 圖片高度 (高字節(jié), 低字節(jié)), 如果不支持 DNL 就必須 >0 - 圖片寬度 (高字節(jié), 低字節(jié)), 如果不支持 DNL 就必須 >0 - components 數(shù)量(1 byte), 灰度圖是 1, YCbCr/YIQ 彩色圖是 3, CMYK 彩色圖 是 4 - 每個 component: 3 bytes - component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q) - 采樣系數(shù) (bit 0-3 vert., 4-7 hor.) - quantization table 號
DRI: Define Restart Interval:
- $ff, $dd (DRI) - 長度 (高字節(jié), 低字節(jié)), 必須是 4 - MCU 塊的單元中的重新開始間隔 (高字節(jié), 低字節(jié)), 意思是說, 每 n 個 MCU 塊就有一個 RSTn 標(biāo)記. 第一個標(biāo)記是 RST0, 然后是 RST1 等, RST7 后再從 RST0 重復(fù)
DQT: Define Quantization Table:
- $ff, $db (DQT) - 長度 (高字節(jié), 低字節(jié)) - QT 信息 (1 byte): bit 0..3: QT 號(0..3, 否則錯誤) bit 4..7: QT 精度, 0 = 8 bit, 否則 16 bit - n 字節(jié)的 QT, n = 64*(精度+1)
備注:
- 一個單獨的 DQT 段可以包含多個 QT, 每個都有自己的信息字節(jié) - 當(dāng)精度=1 (16 bit), 每個字都是高位在前低位在后
DAC: Define Arithmetic Table:
法律原因, 現(xiàn)在的軟件不支持 arithmetic 編碼. 不能生產(chǎn)使用 arithmetic 編碼的 JPEG 文件
DHT: Define Huffman Table:
- $ff, $c4 (DHT) - 長度 (高字節(jié), 低字節(jié)) - 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 代碼的符號數(shù). 這 16 個數(shù)的和應(yīng)該 <=256 - n bytes: 一個包含了按遞增次序代碼長度排列的符號表 (n = 代碼總數(shù))
備注: - 一個單獨的 DHT 段可以包含多個 HT, 每個都有自己的信息字節(jié)
COM: 注釋:
- $ff, $fe (COM) - 注釋長度 (高字節(jié), 低字節(jié)) = L+2 - 注釋為長度為 L 的字符流
SOS: Start Of Scan:
- $ff, $da (SOS) - 長度 (高字節(jié), 低字節(jié)), 必須是 6+2*(掃描行內(nèi)組件的數(shù)量) - 掃描行內(nèi)組件的數(shù)量 (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 (???)
備注: - 圖片數(shù)據(jù) (一個個掃描行) 緊接著 SOS 段.
出處:云風(fēng)工作室
責(zé)任編輯:moby
上一頁 JPEG 簡易文檔 V2.14 [3] 下一頁
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|