JPEG/JPG格式详解

一、简介

	(Joint Photographic Experts Group)是联合图像专家小组的英文缩写,负责制定静态数字图像的编码标准,JPEG/Exif是数码相机和其他图像捕获设备最常用的图像格式,JPEG / JFIF,它是在互联网上存储和传输摄影图像的最常见格式。大体上分为两部分:标记码(TAG)和压缩数据

二、压缩算法

1. 两种基本的压缩算法:

有损的离散余弦变换(Discrete Cosine Transform)DCT、无损的预测技术压缩

2. 两种数据编码方法:

哈夫曼编码、算术编码

3. 四种编码模式:

  1. 基于DCT顺序模式:编/解码通过一次扫描完成
  2. 基于DCT递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进
  3. 无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值
  4. 层次模式:图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息
  5. 在实际应用中,JPEG图像使用的是离散余弦变换、哈夫曼编码、顺序模式。

三、标记码

标记名称Marker内容说明
SOIFF D8Start Of Image图像开始
SOF0FF C0Start Of Frame 0第0帧图像开始
SOF2FF C2Start of Frame 2第2帧图像开始
DHTFF C4Define Huffman Table(s)定义哈夫曼表
DQTFF DBDefine Quantization Table(s)定义量化表
DRIFF DDDefine Restart Interva定义差分编码累计复位的间隔
SOSFF DAStart of Scan扫描开始
RST0~RST7FF D0 ~ FF D7Restart表示在压缩数据流中,每隔n个MCU 块就有一个RST标记
APP0~APP15FF E0 ~ FF EFApplication-sepcific应用程序保留标记,0为JFIF特有部分,1~15支持用户自定义
COMFF FEComment评论、注释
EOIFF D9End of Image图像结束

3.1 格式简介

1、JPEG文件都是以十六进制 'FF D8’开始,以’FF D9’结束
2、JPEG格式都是按段来存储的,分别为0xFF段开始(1字节)+段类型或者叫段标记码(1字节)+段长度(2字节)+段内容。有些段没有长度描述也没有内容,只有段标识,文件头和文件尾均属于这种段。

由于在JPEG文件中0xFF具有标志性的意思,所以在压缩数据流(真正的图像信息)中出现0xFF,就需要作特别处理,如下:
2.1 0x00,则表示0xFF是图像流的组成部分,需要进行译码;

2.2 0xD8,则与0xFF组成标记SOI,则图像流开始,同时图像文件开始;

2.3 0xD9,则与0xFF组成标记EOI,则图像流结束,同时图像文件结束;

2.4 0xD0~0xD7,组成RSTn标记,则要忽视整个RSTn标记,即不对当前0xFF和紧接的0xDn两个字节进行译码并按RST标记的规则调整译码变量;

2.5 0xFF,则忽视当前0xFF,对后一个0xFF再作判断;

2.6 其他数值,则忽视当前0xFF,并保留紧接的此数值用于译码。

2.7 段与段之间无论有多少FF都是合法的,这些FF称为“填充字节”,必须被忽略掉。

3、 JFIF格式的JPEG文件(*.jpg)的一般顺序:

	SOI(0xFFD8)-->APP0(0xFFE0)-->[APPn(0xFFEn)]可选-->DQT(0xFFDB)-->SOF0(0xFFC0)-->DHT(0xFFC4)-->SOS(0xFFDA)-->data

-->EOI(0xFFD9)

4、 EXIF格式的JPEG文件(*.jpg)的一般顺序:

	SOI(0xFFD8)-->APP1(0xFFE1)-->[APPn(0xFFEn)]可选-->DQT(0xFFDB)-->SOF(0xFFC0)-->DHT(0xFFC4)可选-->DRI(0xFF DD)可选

-->SOS(0xFFDA)-->data-->EOI(0xFFD9)

PS:开始(SOI)和结束(EIO)的格式不做详细解释

3.2 JFIF格式 APP0详解

3.2.1 二进制数据

APP0内容如图(蓝色部分):
在这里插入图片描述

3.2.2 APP0结构
名称字节数说明
段标识1FF段开始
段类型1E0JFIF标识码,代表APP0标识段
段长度200 10如果有RGB缩略图就=16+3n
交换格式54A 46 49 46 00“JFIF”的ASCII码,以’\n’终止
版本号201 01第一个字节为主版本号,第二个字节为次版本号,图中代表1.01
密度单位1000=无单位;1=点数/英寸;2=点数/厘米
X像素密度200 01水平方向的密度,不得为0
Y像素密度200 01垂直方向的密度,不得为0
缩略图X像素100缩略图水平像素数目,可以为0
缩略图Y像素100缩略图垂直像素数目,可以为0
RGB缩略图3×n如果“缩略图X像素”和“缩略图Y像素”的值均>0,才有RGB缩略图的数据,n=缩略图X像素×缩略图Y像素

3.3 EXIF格式 APP1详解

3.3.1 二进制数据

在这里插入图片描述
Exif 文件实际是JPEG文件的一种,遵从JPEG标准,只是在文件头信息中增加了有关拍摄信息的内容和索引图

3.3.2 APP1结构
名称字节数说明
段标识1FF段开始
段类型1E1EXIF标识码,代表APP1标识段
段长度215 FE
标识符645 78 69 66 00 00“EXIF”的ASCII码,以空字节终止
TIFF头849 49 2A 00 08 00 00 00TIFF头信息
IFD0 (main image)不固定
IFD1(thumbnail image)不固定

在这里插入图片描述

1、TIFF头:

	1.1 共8个字节,头两个字节表示 Byte align(字节对齐):II表示数字存储遵循 intel 的字节序,即小端存储;MM表示数据存储遵循 Motorola 的字节序,	即大端存储。

	1.2 中间两个字节表示 Tag Mark,是固定值:如果使用 Intel 字节序,则对应的存储值为 0x2a00;如果使用Motorola 的字节序,则存储值为 

0x002a

	1.3 最后四个字节表示到 IFD0(Image File Directory)的偏移:该偏移的起始位置为 TIFFHeader 的起始位置,APP1 Data段中的 IFD0,Exif 

SubIFD,IFD1 中的偏移,也都是以 TIFFHeader的起始位置为基准

2、IFD main image
在这里插入图片描述
在这里插入图片描述
根据 TIFF Header 的后四个字节,我们可以找到第一个 IFD,数据结构如下表所示,IFD结构中存在多个Directory Entry,每个Entry记录着图片的一条属性信息,比如拍摄时间、拍摄机器、图片尺寸等等。

名称字节数说明
目录条目数量209 00此APP1图中代表有9条目录,如上图0900到0000共九条,每条12字节
目录条目108不固定参考下方2.1
下一个IFD的偏移4不固定
Directory Entry data area不固定Directory的数据存储区,存储Entry的值

2.1 目录条目数量:

	此APP1图中代表有9条目录,如上图0900到0000共九条,每条12字节。每条目录分为四个部分:

2.2 目录条目:

	2.2.1 头两个字节对应的内容为 Exif Tag ,次两个字节对应的内容为 Directory Entry存储内容的类型(Component Type)

	2.2.2 后面四个字节存储的是 Directory Entry 对应的Component的数量;

	2.2.3 最后的四个字节,存储的可能是Entry对应的值,Entry对应的值的长度超过四个字节,那么存储的是对应的值的偏移地址(该偏移寻址的基址	也是TIFFHEADER的起始位置)。

3.4 DQT定义量化表详解

JPEG文件一般有2个DQT段,为Y值(亮度)定义1个, 为C值(色度)定义1个,一个DQT段可以包含多个QT, 每个都有自己的信息字节

DQT内容如图(蓝色部分):
在这里插入图片描述

名称字节数说明
段标识1FF段开始
段类型1DB标识码,代表DQT标识段
段长度200 43其值=3+n(当只有一个QT时)
下面的内容部分:
QT信息1000-3位是QT号,4-7位QT精度,此处是0,所以精度是8bit,即1个字节。
QT量化表这个的长度是根据QT信息确定的,上面QT精度为8bit,所以此处是64×1 = 64个字节

3.5 SOF图像信息详解

1、JPEG大都采用yCrCb色彩模型(y表示亮度,Cr红色分量,Cb表示蓝色分量),所以组件数量一般=3;

2、样本就是单个像素的颜色分量,也可理解为一个样本就是一个组件;

3、采样系数是实际采样方式与最高采样系数之比,而最高采样系数一般=0.5(分数表示为1/2)。比如说,垂直采样系数=2,那么2×0.5=1,表示实际采样方式是每个点采一个样,也就是逐点采样;如果垂直采样系数=1,那么:1×0.5=0.5(分数表示为1/2),表示每2个点采一个样

4、组件 ID、采样系数:1=Y, 2=Cb, 3=Cr; 4=I, 5=Q;0-3位:垂直采样系数,4-7位:水平采样系数;

SOF二进制数据

名称字节数说明
段标识1FF段开始
段类型1C0标识码,代表SOF标识段
段长度200 11其值=8+组件数量×3,此处17 = 8 + 3*3,说明组件数量有3个
下面的时内容部分:
样本精度 1108每个样本位数(大多数软件不支持12和16)
图片高度 2203 5F
图片宽度 2205 00
组件数量1031=灰度图,3=YCbCr/YIQ 彩色图,4=CMYK 彩色图
(以下每个组件占用3字节)
组件 ID、采样系数、量化表号(Y组件)301 22 00Y组件,垂直采样系数和水平采样系数都是2,即逐点采样,量化表号是0
组件 ID、采样系数、量化表号(Cb组件)302 11 01Cb组件,垂直采样系数和水平采样系数都是1,即隔点采样,量化表号是1
组件 ID、采样系数、量化表号(Cr组件)303 11 01Cr组件,垂直采样系数和水平采样系数都是1,即隔点采样,量化表号是1

3.6 DHT定义huffman表

1、JPEG文件里有2类Haffman 表:一类用于DC(直流量),一类用于AC(交流量)。一般有4个表:亮度的DC和AC,色度的DC和AC。最多可有6个。
2、一个DHT 段可以包含多个HT表, 每个都有自己的信息字节
3、HT表是一个按递增次序代码长度排列的符号表。

在这里插入图片描述

名称字节数说明
段标识1FF段开始
段类型1C4标识码,代表DHT标识段
段长度200 1F其值=19+n(当只有一个HT表时)
下面的时内容部分:
HT信息1000-3位:HT号;4位:HT类型, 0=DC表,1=AC表;5-7位:必须=0
HT位表1600 -00(B5上方)这16个数的和应该≤256
HT值表n00-0B

在这里插入图片描述

4、段长度:此处1F(16进制)=31(10进制)=19(段长度2个字节+HT信息1个字节+HT位表16个字节) + 12(这个数代表HT值表有12个字节)

5、HT信息:此处一共有4个Haffman 表,亮度DC Haffman 表,亮度AC Haffman 表,色度DC Haffman 表,色度AC Haffman 表
在这里插入图片描述
6、HT位表:这16个数字值和小于等于256,此处加起来是12(此处和段长度是相匹配的),说明HT表有12个字节

3.7 SOS扫描行开始

在这里插入图片描述

名称字节数说明
段标识1FF段开始
段类型1DA标识码,代表SOS标识段
段长度200 0C其值=6+2×扫描行内组件数量
下面的时内容部分:
扫描行内组件数量103必须≥1,≤4(否则错误),通常=3
组件ID、Huffman表号201 00Y组件,AC表号是0,DC表号是0
组件ID、Huffman表号202 11Cb组件,AC表号是1,DC表号是1
组件ID、Huffman表号203 11Cr组件,AC表号是1,DC表号是1
后面的3字节不知道有什么作用3紧接着的F8是数据scanData部分,到FF D9结束

1、段长度:0C = 12 = 6(2个字节的扫描行开始头+1个字节扫描行内组件数量+3个字节的剩余位) + 2×3(扫描行内组件数量,每个组件2个字节)

2、组件ID:1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q

3、Huffman表号:0-3位:AC表号 (其值=0…3) 4-7位:DC表号(其值=0…3)

4、后面是数据scanData部分,到FF D9(EOI)结束

3.8 其他段

3.7.1 COM(注释)
名称字节数说明
段标识1FF段开始
段类型1FE标识码,代表COM标识段
段长度2其值=注释字符的字节数+2
内容注释字符

说明:有的JPEG文件没有这个段

3.7.2 DRI(定义重新开始间隔)
名称字节数说明
段标识1FF段开始
段类型1DD标识码,代表DRI标识段
段长度24
开始间隔2n复位标记的间隔距离
1、开始间隔表示在压缩数据流中,每隔n个MCU 块就有一个RST标记,RST标记将Huffman 的解码数据流复位,DC也重新从0开始,因此,RST标记是一种复位标记

2、RST 标记是一种特殊的段,它只具有段标识和段类型(长度=2字节),但它不是独立的段,只能穿插在数据流中(文件头和文件尾段也只有段标识和段类型,却都是独立的段)。

3、RST标记共有8个(RST0-RST7),从RST0起开始使用,然后是RST1….直至RST7,再从RST0重复

4、RST标记的标识码是 FFD0-FFD7,对应 RST0-RST7

说明:这个不是必须段,很多JPEG都没有。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值