什么是 JPEG 文件?
JPEG 是一种使用有损压缩方法保存的图像格式。作为压缩的结果,输出图像是存储大小和图像质量之间的权衡。用户可以调整压缩级别以达到所需的质量级别,同时减小存储大小。如果对图像应用 10:1 压缩,则对图像质量的影响可以忽略不计。压缩值越高,图像质量的劣化程度越高。
文件格式规范##
JPEG 图像文件格式由联合图像专家组标准化,因此名称为 JPEG。该格式一直是在网络上存储和传输照片图像的选择。几乎所有操作系统现在都有支持 JPEG 图像可视化的查看器,这些图像通常也以 JPG 扩展名存储。甚至网络浏览器也支持 JPEG 图像的可视化。在进入 JPEG 文件格式规范之前,需要提及 JPEG 创建所涉及的步骤的总体过程。
JPEG 压缩步骤
**转换:**彩色图像从RGB转换为亮度/色度图像(眼睛对亮度敏感,而不是色度,因此色度部分会丢失很多数据,因此可以高度压缩。
下采样: 下采样是针对有色分量而非亮度分量进行的。下采样以水平 2:1 和垂直 1:1 的比率进行(2h 1 V)。因此,由于未触摸“y"分量,因此图像尺寸减小,图像质量没有明显损失。
按组组织: 每个颜色分量的像素被组织成 8×2 像素的组,称为“数据单元",如果行数或列数不是 8 的倍数,则底行和最右边的列是重复的。
**离散余弦变换:**离散余弦变换 (DCT) 然后应用于每个数据单元以创建 8×8 变换分量图。由于计算机算术的精度有限,DCT 涉及一些信息丢失。这意味着即使没有地图,图像质量也会有一些损失,但通常很小。
量化: 数据单元中的 64 个变换分量中的每一个都除以一个称为“量化系数 (QC)“的单独数字,然后四舍五入为整数。这是信息丢失不可挽回的地方,大质量控制会导致更多损失。通常,大多数 JPEG 实现允许使用 JPEG 标准推荐的 QC 表。
编码: 使用 RLE 和 Huffman 编码的组合对每个数据单元的 64 个量化变换系数(现在是整数)进行编码。
**添加标题:**最后一步添加标题和所有使用的JPEG参数并输出结果。
JPEG 解码器使用相反的步骤从压缩图像生成原始图像。
文件结构###
JPEG 图像表示为一系列片段,其中每个片段都以标记开头。每个标记都以 0xFF 字节开头,后跟标记标志以表示标记的类型。标记后跟的有效负载因标记类型而异。常见的 JPEG 标记类型如下所列:
简称 | 字节 | 有效负载 | 名称 | 评论 |
---|---|---|---|---|
SOI | 0xFF, 0xD8 | 无 | 图像开始 | |
S0F0 | 0xFF, 0xC0 | 可变大小 | 帧开始 | |
S0F2 | 0xFF, 0xC2 | 可变大小 | 从帧开始 | |
DHT | 0xFF, 0xC4 | 可变大小 | 定义霍夫曼表 | |
DQT | 0xFF, 0xDB | 可变大小 | 定义量化表 | |
DRI | 0xFF, 0xDD | 4 字节 | 定义重启间隔 | |
SOS | 0xFF, 0xDA | 可变大小 | 扫描开始 | |
RSTn | 0xFF, 0xD//n//(/zh//n//#0..7) | 无 | 重启 | |
APPn | 0xFF, 0xE//n// | 可变大小 | 特定于应用 | |
COM | 0xFF, 0xFE | 可变大小 | 评论 | |
EOI | 0xFF, 0xD9 | 无 | 图像结尾 |
在熵编码数据中,在任何 0xFF 字节之后,编码器会在下一个字节之前插入一个 0x00 字节,这样就不会出现不打算使用的标记,从而防止帧错误。解码器必须跳过这个 0x00 字节。这种技术称为 字节填充(参见 JPEG 规范第 F.1.2.3 节),仅适用于熵编码数据,不适用于标记有效负载数据.但是请注意,熵编码数据有一些自己的标记;特别是重置标记(0xD0 到 0xD7),它们用于隔离独立的熵编码数据块以允许并行解码,并且编码器可以定期插入这些重置标记(尽管并非所有编码器都这样做)。