jpeg是1992年发布的图片编码标准,20多年过去了,它在如今图片压缩领域仍然占据着重要地位。本文主要针对标准ISO/IEC 10918-1 分析jpeg文件结构以及解码流程。
Jpeg文件由一个一个段来存储。段的一般结构为:前两个字节为段标识(第一个字节为0xff,第二个字节对于不同段,这个值是不同的),后面紧跟两个字节为该段的长度,该长度不包含段标识的两个字节。
名称 | 字节数 | 数据 | 说明 |
---|---|---|---|
段标识 | 1 | 0xff | 每个段的开始标识 |
段类型 | 1 | 段类型标记码 | |
段长度 | 2 | 包括段内容和段长度本身,不包含段标识和段类型 | |
段内容 | <=65533字节 |
jpeg文件关键结构如下图所示,包含如下几个关键段:
Jpeg的段类型有30多种,其中有10种是必须识别的,其他类型都可以忽略。
名称 | Bits | 数值 | 说明 |
---|---|---|---|
段标识 | 8 | FF | |
段类型 | 8 | DB | |
段长度 | 16 | ||
精度 | 4 | 0 | 表示8bit精度;1表示16bit精度 |
量化表id | 4 | ||
量化表数据 | 64x数据精度(8或16) |
名称 | Bits | 数值 | 说明 |
---|---|---|---|
段标识 | 8 | FF | |
段类型 | 8 | C0-CF | |
段长度 | 16 | ||
像素精度 | 8 | ||
图片高 | 16 | ||
图片宽 | 16 | ||
通道数 | 8 | 1表示灰度图;3表示YCbCr;4表示CMYK | 数值不能超过4 |
通道ID | 8 | 1-Y;2-Cb;3-Cr;4-I;5-Q | |
水平采样系数 | 4 | 采样系数是实际采样方式与最高采样系数之比,而最高采样系数一般是0.5 | |
垂直采样系数 | 4 | ||
选择量化表ID | 8 |
名称 | Bits | 数值 | 说明 |
---|---|---|---|
段标识 | 8 | FF | |
段类型 | 8 | C4 | |
段长度 | 16 | ||
表类型 | 4 | 0表示DC表;1表示AC表 | |
表ID | 4 | ||
位表 | 16x8 | 每种位长的编码再huffman树中的个数 | |
Huffman表数据 | Nx8(n表示位表16个数之和) |
名称 | Bits | 数值 | 说明 |
---|---|---|---|
段标识 | 8 | FF | |
段类型 | 8 | DA | |
段长度 | 16 | ||
该scan内通道数 | 8 | 必须在1-4范围内 | |
通道ID | 8 | 如果有n个通道,这三个变量需要重复n次 | |
DC系数解码使用的Huffman表ID | 4 | ||
AC系数解码使用的Huffman表ID | 4 | ||
24 | 剩余三个字节忽略 |
名称 | Bits | 数值 | 说明 |
---|---|---|---|
段标识 | 8 | FF | |
段类型 | 8 | DA | |
段长度 | 16 | ||
复位间隔 | 8 | 复位标记的间隔距离 |
1.复位间隔标识在压缩数据流中,每隔n个MCU块就有一个RST标记,RST标记将huffman的解码数据复位,DC也重新从0开始。
2.RST标记共有8个(RST0-RST7),冲RST0开始使用,按顺序到RST7,再从RST0开始。
Jpeg标准中,image、frame、scan几个概念的区别。
Image表示一个jpeg图片。对于顺序(sequential)模式和progressive编码图片,一个image只包含一个frame。Hierarchical模式的image包含多个frame。
一个frame由一个或多个scan组成。对于顺序模式编码的图片,一个scan包含一个或多个颜色通道。如图1所示,一个frame由三个scan组成,如果以非交错方式存放数据,每个scan只有一个通道的数据;如果以交错方式,则一个scan存放3个通道的数据。
如果图片各颜色通道的分辨率不一样,如图2所示,B和C通道的宽是A通道的一半。其数据交错存放方式为途中所示。
Jpeg编码的最小单元MCU(minimum coded unit),一个scan包含一个或多个MCU。MCU由一个或多个数据单元(data unit)构成,数据单元是8x8数据块。对于非交错存放方式,MCU是由一个数据单元构成;如果是交错存放方式,MCU由每个通道一个或多个数据单元组成。图1中交错方式的第一个MCU包括A1、B1、C1,图2中第一个MCU包含4个数据单元A1、A2、B1、C1.
Jpeg解码流程如下图所示:
Jpeg重建图像的基本单元时data unit(8x8数据块)。对于数据单元处理过程与mpeg1/2的block解码类似。解码过程的输入为8x8数据块的压缩数据,输出为该数据块的重建值。因为最终数据经过了huffman熵编码压缩,所以解码过程依赖DHT解析的huffman表。