现在的位置: 首页 > 综合 > 正文

一些数组的注意事项!

2014年09月05日 ⁄ 综合 ⁄ 共 2622字 ⁄ 字号 评论关闭

  一、JPEG文件格式简介

  附: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 03: QT 号(03, 否则错误)

  bit 47: 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 03: HT 号 (03, 否则错误)

  bit 4 : HT 类型, 0 = DC table, 1 = AC table

  bit 57: 必须是 0

  - 16 bytes: 长度是 116 代码的符号数。 这 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 03: AC table (03)

  - bit 47: DC table (03)

  - 忽略 3 bytes (???)

  备注:

  - 图片数据 (一个个扫描行) 紧接着 SOS 段。

抱歉!评论已关闭.