【转自网络  作者:
江秋水




一、简述

JPEG是一个压缩标准,又可分为标准 JPEG、渐进式JPEG及JPEG2000三种:



①标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支持最高级 别的压缩,不过,这种压缩是有损耗的。此类型图片在网页下载时只能由上而下依序显示图片,直到图片资料全部下载完毕,才能看到全貌。

②渐进式 JPEG:渐进式JPG为标准JPG的改良格式,支持交错,可以在网页下载时,先呈现出图片的粗略外观后,再慢慢地呈现出完整的内容,渐进式JPG的文件 比标准JPG的文件要来得小。

③JPEG2000:新一代的影像压缩法,压缩品质更好,其压缩率比标准JPEG高约30%左右,同时支持有损 和无损压缩。一个极其重要的特征在于它能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,让图像由朦胧到清晰显示。



以一幅24 位彩色图像为例,JPEG的压缩分为四个步骤:



①颜色转换:在将彩色图像进行压缩之前,必须先对颜色模式进行数据转换。转换完成之后 还需要进行数据采样。

②DCT 变换:是将图像信号在频率域上进行变换,分离出高频和低频信息的处理过程,然后再对图像的高频部分(即图像细 节)进行压缩。首先以象素为单位将图像划分为多个8×8的矩阵,然后对每一个矩阵作DCT 变换。把8×8的象素矩阵变成8×8的频率系数矩阵(所谓频率 就是颜色改变的速度),频率系数都是浮点数。

③量化:由于下面第四步编码过程中使用的码本都是整数,因此要对频率系数进行量化,将之转换为整 数。数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是造成图像压缩后失真的主要原因。这一过程中,质量因子的选取至为重要。 值选得大,可以大幅度提高压缩比,但是图像质量就比较差,质量因子越小图像重建质量越好,但是压缩比越低。

④编码:编码是基于统计特性的方 法。



四个步骤都完成后的JPEG文件,其基本数据结构为两大类型:“段”和经过压缩编码的图像数据。





二、数 据结构



1.段的一般结构如下表所示:



表1:段的一般结构

-----------------------------------------------------------------

名 称    字节数 数据  说明

-----------------------------------------------------------------

段 标识   1     FF    每个新段的开始标识

段类型   1           类型编码(称作“标记码”)

段长 度   2           包括段内容和段长度本身,不包括段标识和段类型

段内容               ≤65533字节

-----------------------------------------------------------------

说明:

①JPG 文件中所有关于宽度高度长度间隔这一类数据,凡是>1字节的,均采用Motorola格式,即:高位在前,低位在后。

② 有些段没有长度描述也没有内容,只有段标识和段类型。文件头和文件尾均属于这种段。

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





2.段类型有30种,但只有10种是必须被所有程序识别的,其它的类型都可以忽略。所以下面只列出这 10种类型。



表2:段类型

---------------------------------------

名称  标 记码  说明

---------------------------------------

SOI    D8     文件头

EOI    D9     文 件尾

SOF0   C0     帧开始(标准 JPEG)

SOF1   C1     同上

DHT    C4     定 义 Huffman 表(霍夫曼表)

SOS    DA     扫描行开始

DQT    DB     定义量化表

DRI    DD     定 义重新开始间隔

APP0   E0     定义交换格式和图像识别信息

COM    FE     注释

-----------------------------------------------------------

说明:有的文章也将DNL段(标记码=DC,定义扫描行数)列为必须段。





3.以下按一般JPEG文件的段排列顺序详细介绍 各种段的结构:



表3:SOI(文件头)

-----------------

名称  字节数   值

-----------------

段 标识   1     FF

段类型   1     D8 

-----------------

说明:这两个字节构成了 JPEG文件头。





表4:APP0(图像识别信息)

--------------------------------------------------------------------------

名 称       字节数 值          说明

--------------------------------------------------------------------------

段 标识        1   FF

段类型        1   E0

段长度        2   0010        如果有 RGB缩略图就=16+3n

(以下为段内容)

交换格式      5   4A46494600  “JFIF”的ASCII码

主 版本号      1

次版本号      1  

密度单位      1               0=无单位;1=点数/英 寸;2=点数/厘米

X像素密度     2               水平方向的密度   

Y像素密 度     2               垂直方向的密度

缩略图X像素   1               缩略图水平像素数目  

缩 略图Y像素   1               缩略图垂直像素数目

(如果“缩略图X像素”和“缩略图Y像素”的值均>0,那么才有下面的数 据)

RGB缩略图    3×n             n=缩略图像素总数=缩略图X像素×缩略图Y像素

--------------------------------------------------------------------------

说明:

①JFIF是JPEG File Interchange Format的缩写,即JPEG文件交换格式,另外还有TIFF等格式,很少 用

②“如果有RGB缩略图就=16+3n”是什么意思呢?比如说“缩略图X像素”和“缩略图Y像素”的值均为48,就表示有一个48×48像素的 缩略图(n=48×48),缩略图是24位真彩位图,用3个字节来表示一个像素,所以共占用3n个字节。但大多数JPG文件都没有这个“鸡肋”缩略图。





表 5:COM(注释)

--------------------------------------------------------------------------

名 称    字节数   值    说明

--------------------------------------------------------------------------

段 标识    1      FF

段类型    1      FE

段长度    2            其值=注释字符的字节数+2

段 内容                 注释字符

--------------------------------------------------------------------------

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

作者:一 江秋水      发表时间:2010-1-30 9:59:00

 第楼  



表6:DQT(定义量化表)



--------------------------------------------------------------------------

名 称    字节数   值    说明

--------------------------------------------------------------------------

段 标识    1      FF

段类型    1      DB

段长度    2      43    其值=3+n(当只有一个 QT时)

(以下为段内容)

QT信息    1            0-3位:QT号

4-7 位:QT精度(0=8bit,1字节;否则=16bit,2字节)

QT        n            n=64×QT精度的字节数

--------------------------------------------------------------------------

说明:

①JPEG文件一般有2个DQT段,为Y值(亮度)定义1个, 为C值(色度)定义1个。 

②一个DQT段可以包含多个 QT, 每个都有自己的信息字节





表7:SOF0(图像基本信息)

--------------------------------------------------------------------------

名 称  字节数   值    说明

--------------------------------------------------------------------------

段 标识   1     FF

段类型   1     C0

段长度   2           其值=8+组件数量×3

(以 下为段内容)

样本精度  1    8     每个样本位数(大多数软件不支持12和16)

图片高度  2

图片宽度  2

组 件数量  1    3     1=灰度图,3=YCbCr/YIQ 彩色图,4=CMYK 彩色图

(以下每个组件占用3字节)

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

采样系数  1          0-3位:垂直采 样系数

4-7位:水平采样系数

量化表号  1

---------------------------------------------------------------------------

说明:

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

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

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





表8:DHT(定义Huffman表)

--------------------------------------------------------------------------

名 称    字节数   值    说明

--------------------------------------------------------------------------

段 标识    1      FF

段类型    1      C4

段长度    2            其值=19+n(当只有一个 HT表时)

(以下为段内容)

HT信息    1            0-3位:HT号

4 位:   HT类型, 0=DC表,1=AC表

5-7位:必须=0

HT位 表    16           这16个数的和应该≤256

HT值表    n            n=表头16个数的和

--------------------------------------------------------------------------

说明:

①JPEG文件里有2类Haffman 表:一类用于DC(直流量),一类用于AC(交流量)。一般有4个表:亮度的DC和AC,色度的 DC和AC。最多可有6个。

②一个DHT 段可以包含多个HT表, 每个都有自己的信息字节

③HT表是一个按递增次序代码长度排列的符号 表。





表9:DRI(定义重新开始间隔)

--------------------------------------------------------------------------

名 称    字节数   值    说明

--------------------------------------------------------------------------

段 标识    1      FF

段类型    1      DD

段长度    2      4 

(以下为段内容)

开 始间隔  2      n    复位标记的间隔距离

---------------------------------------------------------------------------

说明:

①开始间隔表示在压缩数据流中,每隔n个MCU 块就有一个RST标记,RST标记将Huffman 的解码数据流复位,DC也重新从0 开始,因此,RST标记是一种复位标记

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

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

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

⑤笔者查看了 许多自己电脑上的JPG文件的数据,未发现DRI段和RST标记,所以无法进行详尽的考察





表10:SOS(扫描行开始)

--------------------------------------------------------------------------

名 称          字节数   值    说明

--------------------------------------------------------------------------

段 标识           1     FF

段类型           1     DA

段长 度           2     000C  其值=6+2×扫描行内组件数量

(以下为段内容)

扫描行内组件数 量 1     3     必须≥1,≤4(否则错误),通常=3

(以下每个组件占用2字节)

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

Huffman表 号      1           0-3位:AC表号 (其值=0...3)

4-7 位:DC表号(其值=0...3)



3           最后3个字节用途不明,忽略

--------------------------------------------------------------------------

说明:紧接SOS段后的是压缩的图像数据(一个个扫描行),数据存放顺序是从左到右、从上到下。





表11:EOI(文件尾)

------------------

名 称  字节数   值

------------------

段标识   1     FF

段类型   1     D9 

------------------

说明:这两个字节构成了JPEG文件尾。
 

三、实例分析

用系统自带的画图程序画一个32×24的红色方块,另存为JPG文件,这个文件的全部数据如下:



0000: FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 00 60

0010: 00 60 00 00 FF DB 00 43 00 08 06 06 07 06 05 08

0020: 07 07 07 09 09 08 0A 0C 14 0D 0C 0B 0B 0C 19 12

0030: 13 0F 14 1D 1A 1F 1E 1D 1A 1C 1C 20 24 2E 27 20

0040: 22 2C 23 1C 1C 28 37 29 2C 30 31 34 34 34 1F 27

0050: 39 3D 38 32 3C 2E 33 34 32 FF DB 00 43 01 09 09

0060: 09 0C 0B 0C 18 0D 0D 18 32 21 1C 21 32 32 32 32

0070: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32

0080: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32

0090: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 FF C0

00A0: 00 11 08 00 18 00 20 03 01 22 00 02 11 01 03 11

00B0: 01 FF C4 00 1F 00 00 01 05 01 01 01 01 01 01 00

00C0: 00 00 00 00 00 00 00 01 02 03 04 05 06 07 08 09

00D0: 0A 0B FF C4 00 B5 10 00 02 01 03 03 02 04 03 05

00E0: 05 04 04 00 00 01 7D 01 02 03 00 04 11 05 12 21

00F0: 31 41 06 13 51 61 07 22 71 14 32 81 91 A1 08 23

0100: 42 B1 C1 15 52 D1 F0 24 33 62 72 82 09 0A 16 17

0110: 18 19 1A 25 26 27 28 29 2A 34 35 36 37 38 39 3A

0120: 43 44 45 46 47 48 49 4A 53 54 55 56 57 58 59 5A

0130: 63 64 65 66 67 68 69 6A 73 74 75 76 77 78 79 7A

0140: 83 84 85 86 87 88 89 8A 92 93 94 95 96 97 98 99

0150: 9A A2 A3 A4 A5 A6 A7 A8 A9 AA B2 B3 B4 B5 B6 B7

0160: B8 B9 BA C2 C3 C4 C5 C6 C7 C8 C9 CA D2 D3 D4 D5

0170: D6 D7 D8 D9 DA E1 E2 E3 E4 E5 E6 E7 E8 E9 EA F1

0180: F2 F3 F4 F5 F6 F7 F8 F9 FA FF C4 00 1F 01 00 03

0190: 01 01 01 01 01 01 01 01 01 00 00 00 00 00 00 01

01A0: 02 03 04 05 06 07 08 09 0A 0B FF C4 00 B5 11 00

01B0: 02 01 02 04 04 03 04 07 05 04 04 00 01 02 77 00

01C0: 01 02 03 11 04 05 21 31 06 12 41 51 07 61 71 13

01D0: 22 32 81 08 14 42 91 A1 B1 C1 09 23 33 52 F0 15

01E0: 62 72 D1 0A 16 24 34 E1 25 F1 17 18 19 1A 26 27

01F0: 28 29 2A 35 36 37 38 39 3A 43 44 45 46 47 48 49

0200: 4A 53 54 55 56 57 58 59 5A 63 64 65 66 67 68 69

0210: 6A 73 74 75 76 77 78 79 7A 82 83 84 85 86 87 88

0220: 89 8A 92 93 94 95 96 97 98 99 9A A2 A3 A4 A5 A6

0230: A7 A8 A9 AA B2 B3 B4 B5 B6 B7 B8 B9 BA C2 C3 C4

0240: C5 C6 C7 C8 C9 CA D2 D3 D4 D5 D6 D7 D8 D9 DA E2

0250: E3 E4 E5 E6 E7 E8 E9 EA F2 F3 F4 F5 F6 F7 F8 F9

0260: FA FF DA 00 0C 03 01 00 02 11 03 11 00 3F 00 E2

0270: E8 A2 8A F9 93 F7 10 A2 8A 28 00 A2 8A 28 00 A2

0280: 8A 28 03 FF D9



分 析:

0000-0001:FF D8(文件头)

0002-0013:APP0段,其中:

0002-0003:FF E0(段 标记)

0004-0005:00 10(段长度=16字节)

0006-000A:4A 46 49 46 00(“JFIF”的 ASCII码)

000B-000C:01 01(主次版本号=1.01)

000D     :01(密度单位为 点数/英寸)

000E-0011:00 60 00 60(水平和垂直的密度均为每英寸96像素)

0012-0013:00 00(没有缩略图)

0014-0058:DQT 段,其中:

0014-0015:FF DB(段标记)

0016-0017:00 43(段长度=67字节)

0018     :00(QT号=0,QT精度=8bit)

0019-0058:QT

0059-009D:DQT段,其中:

0059-005A:FF DB(段标记)

005B-005C:00 43(段长度=67字节)

005D     :01(QT号=1,QT精度=8bit)

005E-009D:QT

009E-00B0:SOF0段,其中:

009E-009F:FF C0(段标记)

00A0-00A1:00 11(段长度=17字节)

00A2     :08(样 本精度=8bit)

00A3-00A6:00 18 00 20(图像高=24,图像宽=32)

00A7     :03(组件 数量=3,YCbCr彩色图)

00A8     :01(ID号=1,这是亮度Y组件)

00A9     :22(化为二进 制=00100010,表明垂直和水平采样系数均=2)

00AA     :00(使用QT号=0的量化表)

00AB     :02(ID号=2,这是色度Cb组件)

00AC     :11(化为二进制=00010001,表明垂直和水平采样系 数均=1)

00AD     :01(使用QT号=1的量化表)

00AE     :03(ID号=3,这是色度Cr组件)

00AF     :11(化为二进制=00010001,表明垂直和水平采样系数均=1)

00B0     :01(使用QT号=1的量 化表)

00B1-00D1:DHT段,其中:

00B1-00B2:FF C4(段标记)

00B3-00B4:00 1F(段长度=31字节)

00B5     :00(HT号=0,DC表)

00B6-00C5:这 16个数字之和=12,说明下面的HT值表的长度=12字节)

00C6-00D1:HT值表

00D2-0188:DHT段,这是HT 号=0的AC表,参照上面分析

0189-01A9:DHT段,这是HT号=1的DC表,参照上面分析

01AA-0260:DHT段,这是 HT号=1的AC表,参照上面分析

0261-026E:SOS段,其中:

0261-0262:FF DA(段标记)

0263-0264:00 0C(段长度=12字节)

0265     :03(组件数量=3)

0266-0267:01 00(组件ID=1,Y组件,使用HT表号=0的AC表)

0268-0269:02 11(组件ID=2,Cb组 件,使用HT表号=1的DC表)

026A-026B:03 11(组件ID=3,Cr组件,使用HT表号=1的DC表)

026C-026E:00 3F 00(几乎每个JPG文件中这3个字节的值都相同,但用途不明)

026F-0282:图像压缩数据

0283-0284:FF D9(文 件尾)

JPG文件结构分析的更多相关文章

  1. PNG文件结构分析 ---Png解析

    PNG文件结构分析 ---Png解析   为了实现更高级的应用,我们必须充分挖掘PNG的潜力. PNG的文件结构 根据PNG文件的定义来说,其文件头位置总是由位固定的字节来描述的:   十进制数 13 ...

  2. VS 解决方案文件结构分析

    VS2013 解决方案文件结构分析 Visual Studio 的解决方案文件是一个文本文件,其中的内容不是太复杂,有些时候 Visual Studio 会把这个文件搞乱,理解一下这个文件的结构,对我 ...

  3. PNG文件结构分析

    http://blog.163.com/iwait2012@126/blog/static/16947232820124411174877/ PNG文件结构分析 对于一个PNG文件来说,其文件头总是由 ...

  4. Python逆向(二)—— pyc文件结构分析

    一.前言 上一节我们知道了pyc文件是python在编译过程中出现的主要中间过程文件.pyc文件是二进制的,可以由python虚拟机直接执行的程序.分析pyc文件的文件结构对于实现python编译与反 ...

  5. VS2013 解决方案文件结构分析

    http://www.cnblogs.com/haogj/p/4248030.html Visual Studio 的解决方案文件是一个文本文件,其中的内容不是太复杂,有些时候 Visual Stud ...

  6. Heritrix源码分析(六) Heritrix的文件结构分析(转)

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/642618      本博客已迁移到本人独立博客: http://www.yun5u. ...

  7. REdis AOF文件结构分析

    REdis-4.0之前的AOF文件没有文件头,而从REdis-4.0开始AOF文件带有一个文件头,文件头格式和RDB文件头相同. REdis-4.0版本,如果开启aof-use-rdb-preambl ...

  8. Quick-Cocos2d-x文件结构分析

    在上一章我们讲过了Quick-Cocos2d-x中的环境搭建,这章我们分析下quick中的文件结构吧!打开quick的文件夹,可以看到如下的这些目录和文件: bin:存放各种与引擎相关的脚本 comp ...

  9. 【转载】Quick-Cocos2d-x文件结构分析

    在上一章我们讲过了Quick-Cocos2d-x中的环境搭建,这章我们分析下quick中的文件结构吧!打开quick的文件夹,可以看到如下的这些目录和文件: bin:存放各种与引擎相关的脚本 comp ...

  10. BT种子文件文件结构分析(转)

    估计80%以上接触互联网的人都知道bt是什么东西,任何一个用bt下载的人都知道这样一个概念,种子.bt种子就是记录了p2p对等网络中tracker, nodes, files等信息,也就是说,这个种子 ...

随机推荐

  1. python集合以及编码初识

    一.集合  set 集合是无序的,天然能去重,是可变的.例:s = {1,2,3,4,5} s = {} s1 = {1} print(type(s)) # 空{}就是字典 print(type(s1 ...

  2. .Net Core: 跨域Cros概要

    读取配置 public class AppConfig { public static IConfigurationRoot Configuration { get; set; } public st ...

  3. stl常数测试

    如图: 数组的常数约为9.

  4. Oracle - 特殊字符问题

    Oracle更新表字段或者查询表字段时内容中含有特殊字符&的解决方法 现象 解决方式 1. 字符串拼接 UPDATE T_MENU_INFO SET menu_code='/ABeptjk/g ...

  5. 51nod 1020

    求 $n$ 个数的排列中逆序数为 $k$ 的排列数$f[n][k]$ 表示 $n$ 个数的排列中逆序数为 $k$ 的排列数$f[n][k] = \sum_{i = 0}^{n - 1} f[n - 1 ...

  6. mac charles 代理https

    1.安装根证书:help - ssl proxying - install charles root certificate 2.这时候会弹出一个根证书界面,如果没有弹出,则可以去chrome,高级设 ...

  7. Applications (ZOJ 3705)

    题解:就是题目有点小长而已,可能会不想读题,但是题意蛮好理解的,就是根据条件模拟,计算pts.(送给队友zm. qsh,你们不适合训练了.) #include <iostream> #in ...

  8. 使用devstack安装openstack

    使用devstack安装openstack 环境介绍,宿主机器 Fedora release 29 (Twenty Nine) 40核心cpu,32g内存 设想, 在fedora中安装kvm,虚拟出U ...

  9. Linux rpm 安装MySQL

    1 检查是否存在旧版本mysql (1) mysql 执行命令:rpm -qa|grep mysql,若存在旧mysql,删除查询到的旧mysql,执行: rpm -e --nodeps XXXX  ...

  10. golang入门time与string转换, time加减时间, 两个时间差

    package main import ( "fmt" "time") var timeLayoutStr = "2006-01-02 15:04:0 ...