资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
JPEG 文件结构解析 Baseline gymdove gymdove 2005 07 03 一 JPEG 文件的基本结构 图中的红框代表与 Baseline 相关的段 Copied from ITU T T8 1 Recommendation JPEG 文件在 SOI Start Of Image 0 xFFD8 与 EOI End Of Image 0 xFFD9 之间 以数据段为单位来组织内容 数据段的一般结构 段标识符 2 个字节 段长度 2 个字节 段内容 段标识符第一个字节均是 0 xFF 第二个字节表示不同的段 如 0 xFFD8 表示文件 起始 0 xFFC4 表示 Huffman 表定义段 段长度 2 个字节表示这段的字节个数 不包括段标识符的个数 但包括段长度 的 2 个字节 低字节存放的是高位数 高字节存放的是低位数 如 0 x103D 就表 示十六进制数 103D 段内容的长度必须是整数个字节 如果不够一个字节 余下的部分用 1 填充 如 果由于填充而形成了 0 xFF 的话 如最后一个就是 1 比特 1 的情况 此时在形 成的 0 xFF 后还要加上 0 x00 T8 1 F1 2 3 二 APPn 段 段标识符从 0 xFFE0 到 0 xFFEF 都是应用程序段 用于应用程序使用信息的存放 如 Exif 等 在这里忽略 三 DQT 段 DQT 是量化表定义段 0 xFFDB 在这里给出了 JPEG 量化表的信息 图 量化表结构 DQT 0 xFFDB 量化表段标识符 2 个字节 Lq 段长度 2 个字节 Pq 半字节 量化表元素精度 0 表示每个量化表的值为 8 比特 1 表示为 16 比特 Tq 半字节 量化表编号 通常为 0 3 Q 量化值 通常为一个字节 根据量化精度不同而不同 量化值按 Zig Zag 的顺序排列 注 从 Pq 到 Q63为一个完整的量化表 一个量化表段可包含一个或多个量化表 量化表的例子 FF DB 00 84 00 01 03 03 04 03 03 05 04 04 04 05 05 05 06 07 0D 09 08 07 07 08 10 0B 0C 0A 0D 13 11 14 14 13 11 12 12 15 18 1E 1A 15 16 1C 17 12 12 1A 24 1A 1C 1F 20 22 22 22 14 19 25 28 25 21 27 1E 21 22 20 01 01 05 05 07 06 07 0E 08 08 0E 1C 13 10 13 1C 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 FF DB Define quantization table marker 00 84 Lq Quantization table definition length 00 Pq Tq Q0 Q63 01 03 03 04 03 03 05 04 04 04 05 05 05 06 07 0D 09 08 07 07 08 10 0B 0C 0A 0D 13 11 14 14 13 11 12 12 15 18 1E 1A 15 16 1C 17 12 12 1A 24 1A 1C 1F 20 22 22 22 14 19 25 28 25 21 27 1E 21 22 20 01 Pq Tq Q0 Q63 01 05 05 07 06 07 0E 08 08 0E 1C 13 10 13 1C 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 四 DHT 段 图 哈夫曼表段结构 DHT 哈夫曼表段标识符 0 xFFC4 2 字节 Lh 哈夫曼表段长度 2 字节 Tc 半字节 为 0 代表 DC 表或者是无损表 为 1 表示 AC 表 Th 哈夫曼表编号 半字节 Li 1 字节 表示长度为 i 的哈夫曼编码的个数 i 1 16 Vi j 每个哈夫曼编码所代表的值 1 字节 注 1 Tc Th 可一起直接作为哈夫曼表的编号 包括区别 DC 和 AC 表 2 Vi j的个数等于所有 Li值的和 也就是每个哈夫曼编码对应一个值 3 从 Tc Th到 V16 L16是一个完整的哈夫曼表 一个哈夫曼表段可能含有多个哈夫曼表 一个哈夫曼表的例子 FF C4 00 1F 00 00 01 05 01 01 01 01 01 01 00 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09 0A 0B FF C4 Marker 00 1F Segment Length 00 Tc Th it s a DC table index 0 00 01 05 01 01 01 01 01 01 00 00 00 00 00 00 00 The number of Huffman code of length i For example there is 1 Huffman code with length 2 5 Huffman codes with length 3 etc The sum of these is 12 which means that there are 12 different Huffman codes totally in this table 00 01 02 03 04 05 06 07 08 09 0A 0B The values for above Huffman codes 一种哈夫曼表的求解算法 延用上面的哈夫曼表的例子 编码长度 编码个数 哈夫曼编码 2 进制 CODE 操作 1 0 2 1 00 00 1 01 左移 1 位 010 3 010 1 011 3 011 1 100 3 100 1 101 3 101 1 110 3 5 110 1 111 左移 1 位 1110 4 1 1110 1 1111 左移 1 位 11110 5 1 11110 1 11111 左移 1 位 111110 6 1 111110 1 111111 左移 1 位 1111110 7 1 1111110 1 1111111 左移 1 位 11111110 8 1 11111110 1 11111111 左移 1 位 111111110 9 1 111111110 1 111111111 左移 1 位 1111111110 10 0 11 0 12 0 13 0 14 0 15 0 16 0 哈夫曼编码 CODE 总是从 0 开始 对应于第一个编码个数长度非零的第一个编码 如上表 中长度为 2 的编码的第一个编码为 00 然后 CODE 加 1 如果还有这个长度的编码 则下 一个编码就为 CODE 重复 直到这个长度的编码全部完成 CODE 加 1 后 再左移一位 开始下一个长度的编码 如上表中 长度为 3 的编码从 010 到 110 五 SOF 段 图 帧信息段结构 SOFn 帧信息段标识符 2 个字节 从 0 xFFC0 到 0 xFFCF 0 xFFCC 除外 表示不同的编码 方式 0 xFFC0 表示 Baseline 编码方式 Lf 段长度 2 字节 P 采样精度 单位 比特 1 字节 Y 行数 2 字节 表示图像中最大的行数 应该等于所有分量中最大垂直采样的行数 如果为 0 表示由 DNL 和 SOS 段最后的参数决定 参见 SOS 段和 DNL 段 X 每行的点数 表示图像中每行中最大的点数 应该等于所有分量中最大水平采样的 行数 Nf 图像的分量个数 1 字节 通常为 1 或 3 1 表示灰度图 3 表示彩色图 CNf 图像分量的编号 1 字节 通常为 0 到 2 CNf不能有重复的 HNf VNf 第 Nf个分量所使用的水平采样因子 垂直采样因子 1 字节 TNf 第 Nf个分量所使用的量化表编号 1 字节 一个限制 10 1 s N j jj VH 也就是一个 MCU 中的 BLOCK 数小于 10 一个有趣的现象 按理来说 每个分量都有编号 那么交换分量的描述 即类似于 C2H2 V2C1H1 V1C3H3 V3的顺序应该是没有问题的 但是显示程序无一例外的会显示出奇怪 的图 有兴趣的读者 可以试着交换一下 帧信息段的例子 FF C0 00 11 08 06 00 08 00 03 01 22 00 02 11 01 03 11 01 FF C0 Marker 00 11 Lf Frame header Length 08 P Sample precision 06 00 Y Number of lines 08 00 X Number of samples per line 03 Nf Number of image components in frame 01 22 00 C1 H1 V1 Tq1 02 11 01 C2 H2 V2 Tq2 03 11 01 C3 H3 V3 Tq3 批注批注 g1 New Discovery about all these exchanging things I will check it more detailed 六 SOS 段 图 扫描数据段结构 SOS 扫描数据段标识符 2 个字节 0 xFFDA Ls 段长度 2 字节 Ns 扫描数据段中图像分量的个数 1 字节 CSj 扫描数据图像分量编号 1 字节 决定在帧参数指明的 Nf个图像分量中哪一个将 成为扫描数据中第 j 个分量 每个 CSj应等于与一个在帧信息头中说明的 Ci 并且在扫描 数据头中的顺序应该与帧信息头中的相同 如果 Ns 1 在 MCU 中 间隔的分量的顺序是 第一个 Cs1 第二个 Cs2 等等 Tdj 哈夫曼 DC 表编号 半个字节 Taj 哈夫曼 AC 表编号 半个字节 Ss 1 字节 Se 1 字节 Ah Al 1 字节 这三参数与 BaseLine 编码无关 通常是 0 x00 0 x3F 0 x00 在 BaseLine 编码方式中 Ah Al后面直接跟的就是经过编码的数据 直到 EOI 0 xFFD9 扫描数据段的例子 FF DA 00 08 01 01 00 00 3F 00 FC AA FF DA SOS Start of scan marker 00 08 Ls Scan header length 01 Ns Number of image components in scan 01 00 Cs1 Td1 Ta1 00 Ss 3F Se 00 Ah Al FC AA 1111 1100 1010 1010 哈夫曼编码后的数据 七 DRI 段 图 间隔重置定义段结构 DRI 间隔重置定义段标识符 0 xFFDD 2 字节 Lr 段长度 2 字节 Ri 间隔重置 说明在间隔重置中 MCU 的个数 2 字节 如果 Ri等于 0 表明数据 批注批注 g2 It may not be proper to call it 编号 扫描段中 不使用间隔重置方式 通常情况 JPEG 文件不使用间隔重置的方式 八 DNL 段 图 行数定义段 DNL 行数定义段标识符 0 xFFDC 2 字节 Ld 段长度 2 字节 NL 帧的行数 1 字节 参考资料 ITU T T8 1 Recommendation JPEG 简单文档 1 0 批注批注 JT3 对此 我
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号