一个JPEG的文件主要有以下几个部分构成:

简称值(或标识)描述
SOI0xFFD8图像开始标识
APPn0xFFEn应用程序保留标识n(n的取值范围: 0~f)(至少1个)
DQT0xFFDB量化表
SOF00xFFC0帧图像开始
DHT0xFFC4霍夫曼(Huffman)表
SOS0xFFDA扫描开始
DATANone图像数据
EOI0xFFD9图像结束标识

对于这些表(量化表霍夫曼表)我也搞不懂是干什么的,如果想要了解还需自行查询,不过猜测这些都和JPEG的图像压缩相关。

APPn

APP0

JPEG文件交换格式(JPEG File Interchange Format,JFIF),这个应用程序保留标识是最常用,也是最常见的一种标识了,其主要格式如下:

字段大小(bytes)值(或标识)描述
APPP0标识20xFFE0
长度2NoneAPP0标识以外的段长度
标识符50x4A46494600转化成ASCII码就是"JFIF "
JFIF版本号2None主版本号和次版本号
密度单位1None表示单个像素的单位(0~3)
X轴像素密度2None
X轴像素密度2None
缩略图x轴像素1None
缩略图x轴像素1None
缩略图RBG位图3nNone由RGB位图构成,其大小为3的倍数

注:

  1. 密度单位其值表示如下:

    • 0:无单位
    • 1:英寸
    • 2:厘米

DQT

量化表,其主要目的是用于压缩JPEG文件的。

字段大小(bytes)值(或标识)描述
DQT标识20xFFDB
长度2NoneDQT标识以外的段长度
精度&量化表ID1None高4位: 精度(0~1),第4位:表ID(0~3)
量化表 None

注:

  1. 精度其值表示如下:

    • 0:表项的精度为8bits,也就是1byte表示一个单位量。
    • 1:表项的精度为16bits,也就是2bytes表示一个单位量。

SOF0

帧开始,主要是图像的x、y轴数值(也就是分辨率)。

字段大小(bytes)值(或标识)描述
SOF0标识20xFFC0
长度2NoneSOF0标识以外的段长度
精度1None单个像素的位数
图像高度2None单位: 像素
图像宽度2None单位: 像素
颜色分量数量1None指定颜色分量信息的个数(1,3,4)
颜色分量信息3nNone大小为颜色分量数的3倍

注:

  1. 精度:这里的进度实际上指的就是RGB单个颜色的大小,常见的大小为8bits。
  2. 颜色分量数量:其值数量固定,主要用于指定图像显示方式,只可以选择以下其一:

    • 1:表示图像为灰度图
    • 3:表示为YCrCb或YIQ(常用)
    • 4:表示为CMYK
  3. 颜色分量信息:主要指定单个颜色的信息,其又可以分为以下三个参数:

    • 颜色分量ID:1字节
    • 水平/垂直采样因子:1字节

      • 高4bits:水平采样因子
      • 底4bites:垂直采样因子
    • 量化表ID:1字节,指定当前使用的量化表ID(DQT)

DHT

哈夫曼(Huffman)表,同样与JPEG的压缩算法相关

字段大小(bytes)值(或标识)描述
DHT标识20xFFC4
长度2NoneDHT标识以外的段长度
表ID&表类1None高4bits:类型,低4bits:表ID
编码数量16None
编码内容 None大小为编码数量中所有字节之和

注:

  1. 表类:主要指定哈夫曼表的编码方式:

    • 0:DC直流
    • 1:AC交流
注意:表类(DC表和AC表)和表ID是分开编码的。

SOS

图像数据开始

字段大小(bytes)值(或标识)描述
SOS标识20xFFC4
长度2NoneSOS标识以外的段长度
颜色分量数1None应与SOF0处值对应
颜色分量信息2None
压缩图像数据30x003F00

注:

  1. 颜色分量信息:与SOF0中的描述相同,可分为以下两个部分:

    • 颜色分量ID:1字节
    • 系数表号:1字节

      • 高4bits:指定使用直流分量哈夫曼数编号
      • 低4bits:指定使用交流分量哈夫曼数编号
  2. 压缩图像数据:分为以下三个部分:

    • 谱开始:1字节,固定值:0x00
    • 谱结束:1字节,固定值:0x3F
    • 谱选择:1字节,几乎都是:0x00

样例

照片见附件

本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【4JFSECGC】获取授权信息。

最后修改:2020 年 07 月 21 日 08 : 13 PM
如果觉得我的文章对你有用,请随意赞赏