JPEG文件字段
JPEG文件字段
JPEG编解码
目前有较多的图像编码标准,如jpeg、bmp、gif、png、webp、heif,我们这里先说jpeg部分,这个编解码标准诞生于20世纪90年代,JPEG标准仅仅说明定义了codec部分,也就是图片如何压缩为字节流以及重新解码为图片的过程,标准没有涉及到文件的存储格式。
1992年颁布了JPEG File Interchange Format(JFIF),目前在互联网上用的最多的jpeg格式,接着又出现了EXIF格式,主要用于数码产品,记录了媒体的时间地点信息。
JPEG文件由一系列字段组成,每个字段都有marker(标记),由0xff开头。

| SOI | 0xD8 | 图像开始 |
|---|---|---|
| APP0 | 0xE0 | JFIF应用数据块 |
| APPn | 0xE1 - 0xEF | 其他的应用数据块(n, 1~15) |
| DQT | 0xDB | 量化表 |
| SOF0 | 0xC0 | 帧开始 |
| DHT | 0xC4 | 霍夫曼(Huffman)表 |
| SOS | 0xDA | 扫描线开始 |
| EOI | 0xD9 | 图像结束 |
图4 jpeg字段
(1)SOF marker(Start of Frame),这个字段定义了文件的起始

图5 SOF字段
(2)APP0(Application-specific),这个字段定义了JFIF格式

图6 APP0字段(定义JFIF格式)
(3)APPn(Application-specific),定义了其它格式,如APP1表示exif格式

图7 定义APPn字段
(4)DQT(Define Quantization Table(s)),定义了量化表

图8 字义量化表字段
一个或者多个量化表DQT(difine quantization table)
① 量化表长度(quantization table length)
② 量化表数目(quantization table number)
③ 量化表(quantization table)
下面以jpeg图的二进制数据来分析,通过vim打开后(:%!xxd切换到十六进制),ffd8表示start of image,ffe0表示app0,即是JFIF格式,0043前面的ffdb表示量化表(两个ffdb分别表示亮度和色度分量的量化表),0043表示量化表65字节(64byte量化参数 + 1 byte精度及量化表ID),ffc0表示start of frame,即图像数据:
帧图像开始SOF0(Start of Frame)
① 帧开始长度(start of frame length)
② 精度(precision),每个颜色分量每个像素的位数(bits per pixel per color component)
③ 图像高度(image height)
④ 图像宽度(image width)
⑤ 颜色分量数(number of color components)
⑥ 对每个颜色分量(for each component)

图9 jpeg字段分析

浙公网安备 33010602011771号