JPEG文件格式
格式:JFIF(JPEG档的交换格式)
压缩:JPEG(灰阶影像压缩比约为10:1;彩色影像约为20:1)
以JPEG文件格式保存的图像实际上是2个不同格式的混合物:JPEG格式规范本身,用来定义图像的压缩方法,并且被包在定议分辨率和颜色模式的图像数据格式之中。Photoshop和实际上每个能读取和写入JPEG文件格式的其他应用程序,以 JFIF文件格式(JPEG文件交换格式, JPEG File Interchonge Format)或与JFIF格式非常象的其他格式保存图像数据。JFIF文件格式只是将一种图像格或环绕JPEG压缩的一种简单方法,它们没有其他的更多功能。
最初的JFIF文件格式规范史允许8位灰度图像和24位RGB图像;但是Adobe『修改」了此种格式,使之也能处理32位CMYK模式的数据。但是,多数版面设计应用程序实际上不能将 CMYK模式的JPEG图像分离开,所以 Adobe所做的这个修改的意义并不大。JPEG文件格式允许用可变压缩的方法,保存8位、24位、32位深度的图像。例如,当以JPEG格式保存一幅 Photoshop图像时,Photoshop给出了多种保存选项:低压缩率,中等压缩率,高压缩率及最好的分辨率等级别。实验证明,当进行印刷或在显示器上观察时,JPEG一般可将图像压缩为原大小的十分之一而看不出明显差异。图像会分解成8×8像素图像单元的小方块。这种JPEG失真有时会在新闻图片中发现,这些图片在进行电子传输前被大大地压缩了,随後又以高放大倍率进行了印刷。
JPEG使用了有损压缩格式,这就使它成为迅速显示图像并保存较好分辨率的理想格式。也正是由於JPEG格式可以对扫描或自然图像进行大幅度的压缩,利於储存或通过调制解调器进行传送,所以在Internet上得到了广泛的应用。
JPEG格式有一个特殊的变种,名为 「Progressive JPEG」。在创建Progressive JPEG 文件肘,数据是这样安排的:在装入图像时,开始只显示一个模糊的图像,随着数据的装入,图像逐步变得清晰。
JPEG格式的主要不足之处也正是它的最大优点。也就是说,有损压缩算法将JPEG只局限於显示格式,而且每次保存JPEG格式的图像时都会丢失一些数据。因此,通常只在创作的最後阶段以JPEG格式保存一次图像即可。
JPEG简介
微处理机中的存放顺序有正序(big endian)和逆序(little endian)之分。正序存放就是高位元组存放在前低位元组在後,而逆序存放就是低位元组在前高位元组在後。例如,十六进位数爲A02B,正序存放就是A02B,逆序存放就是2BA0。摩托罗拉(Motorola)公司的微处理器使用正序存放,而英代尔(Intel)公司的微处理器使用逆序。JPEG文件中的位元组是按照正序排列的。
________________________________________
JPEG委员会在制定JPEG标准时,定义了许多标记(marker)用来区分和识别图像资料及其相关资讯,但笔者没有找到JPEG委员会对JPEG文件交换格式的明确定义。直到1998年12月从分析网上具体的JPG图像来看,使用比较广泛的还是JPEG文件交换格式(JPEG File Interchange Format,JFIF)版本号爲1.02。这是1992年9月由在C-Cube Microsystems公司工作的Eric Hamilton提出的。此外还有TIFF JPEG等格式,但由於这种格式比较复杂,因此大多数应用程式都支援JFIF文件交换格式。
JPEG文件使用的顔色空间是CCIR 601推荐标准进行的彩色空间(参看第7章)。在这个彩色空间中,每个分量、每个图元的电平规定爲255级,用8位代码表示。从RGB转换成YCbCr空间时,使用下面的精确的转换关系:
Y = 256 * E'y
Cb = 256 * [E'Cb] + 128
Cr = 256 * [E'Cr] + 128
其中亮度电平E'y和色差电平E'Cb和E'Cb分别是CCIR 601定义的参数。由於E'y的范围是0~1,E'Cb和E'Cb的范围是-0.5~+0.5,因此Y, Cb和Cr的最大值必须要箝到255。於是RGB和YCbCr之间的转换关系需要按照下面的方法计算。
(1) 从RGB转换成YCbCr
YCbCr(256级)分量可直接从用8位表示的RGB分量计算得到:
Y = 0.299R + 0.587G + 0.114 B
Cb = - 0.1687R - 0.3313G + 0.5B + 128
Cr = 0.5R - 0.4187G - 0.0813B + 128
需要注意的是不是所有图像文件格式都按照R0,G0,B0,…… Rn,Gn,Bn的次序存储样本资料,因此在RGB文件转换成JFIF文件时需要首先验证RGB的次序。
(2) 从YCbCr转换成RGB
RGB分量可直接从YCbCr(256级)分量计算得到:
R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)
在JFIF文件格式中,图像样本的存放顺序是从左到右和从上到下。这就是说JFIF文件中的第一个图像样本是图像左上角的样本。
文件结构
JFIF文件格式直接使用JPEG标准爲应用程式定义的许多标记,因此JFIF格式成了事实上JPEG文件交换格式标准。JPEG的每个标记都是由2个位元组组成,其前一个位元组是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充位元组(fill byte)。下面是其中的8个标记:
1. SOI 0xD8 图像开始
2. APP0 0xE0 JFIF应用资料块
3. APPn 0xE1 - 0xEF 其他的应用资料块(n, 1~15)
4. DQT 0xDB 量化表
5. SOF0 0xC0 帧开始
6. DHT 0xC4 霍夫曼(Huffman)表
7. SOS 0xDA 扫描线开始
8. EOI 0xD9 图像结束
爲使读者对JPEG定义的标记一目了然,现将JPEG的标记码列於表6-05,并保留英文解释。
表6-05 JPEG定义的标记
Symbol
(符号) Code Assignment
(标记代码) Deforbiddenion
(说明)
Start Of Frame markers, non-hierarchical Huffman coding
SOF0 0xFFC0 Baseline DCT
SOF1 0xFFC1 Extended sequential DCT
SOF2 0xFFC2 Progressive DCT
SOF3 0xFFC3 Spatial (sequential) lossless
Start Of Frame markers, hierarchical Huffman coding
SOF5 0xFFC5 Differential sequential DCT
SOF6 0xFFC6 Differential progressive DCT
SOF7 0xFFC7 Differential spatial lossless
Start Of Frame markers, non-hierarchical arithmetic coding
JPG 0xFFC8 Reserved for JPEG extensions
SOF9 0xFFC9 Extended sequential DCT
SOF10 0xFFCA Progressive DCT
SOF11 0xFFCB Spatial (sequential) Lossless
Start Of Frame markers, hierarchical arithmetic coding
SOF13 0xFFCD Differential sequential DCT
SOF14 0xFFCE Differential progressive DCT
SOF15 0xFFCF Differential spatial Lossless
Huffman table specification
DHT 0xFFC4 Define Huffman table(s)
arithmetic coding conditioning specification
DAC 0xFFCC Define arithmetic conditioning table
Restart interval termination
RSTm 0xFFD0~0xFFD7 Restart with modulo 8 counter m
Other marker
SOI 0xFFD8 Start of image
EOI 0xFFD9 End of image
SOS 0xFFDA Start of scan
DQT 0xFFDB Define quantization table(s)
DNL 0xFFDC Define number of lines
DRI 0xFFDD Define restart interval
DHP 0xFFDE Define hierarchical progression
EXP 0xFFDF Expand reference image(s)
APPn 0xFFE0~0xFFEF Reserved for application use
JPGn 0xFFF0~0xFFFD Reserved for JPEG extension
COM 0xFFFE Comment
Reserved markers
TEM 0xFF01 For temporary use in arithmetic coding
RES 0xFF02~0xFFBF Reserved
JPEG文件由下面的8个部分组成:
(1) 图像开始SOI(Start of Image)标记
(2) APP0标记(Marker)
① APP0长度(length)
② 识别字(identifier)
③ 版本号(version)
④ X和Y的密度单位(units=0:无单位;units=1:点数/英寸;units=2:点数/厘米)
⑤ X方向图元密度(X density)
⑥ Y方向图元密度(Y density)
⑦ 缩略图水平图元数目(thumbnail horizontal pixels)
⑧ 缩略图垂直图元数目(thumbnail vertical pixels)
⑨ 缩略图RGB点阵图(thumbnail RGB bitmap)
(3) APPn标记(Markers),其中n=1~15(任选)
① APPn长度(length)
② 由於详细资讯(application specific information)
(4) 一个或者多个量化表DQT(difine quantization table)
① 量化表长度(quantization table length)
② 量化表数目(quantization table number)
③ 量化表(quantization table)
(5) 帧图像开始SOF0(Start of Frame)
① 帧开始长度(start of frame length)
② 精度(precision),每个顔色分量每个图元的位元数(bits per pixel per color component)
③ 图像高度(image height)
④ 图像宽度(image width)
⑤ 顔色分量数(number of color components)
⑥ 对每个顔色分量(for each component)
o ID
o 垂直方向的样本因数(vertical sample factor)
o 水平方向的样本因数(horizontal sample factor)
o 量化表号(quantization table#)
(6) 一个或者多个霍夫曼表DHT(Difine Huffman Table)
① 霍夫曼表的长度(Huffman table length)
② 类型、AC或者DC(Type, AC or DC)
③ 索引(Index)
④ 位表(bits table)
⑤ 值表(value table)
(7) 扫描开始SOS(Start of Scan)
① 扫描开始长度(start of scan length)
② 顔色分量数(number of color components)
③ 每个顔色分量
o ID
o 交流系数表号(AC table #)
o 直流系数表号(DC table #)
④ 压缩图像资料(compressed image data)
(8) 图像结束EOI(End of Image)
表6-06表示了APP0域的详细结构。有兴趣的读者可通过UltraEdit或者PC TOOLS等工具软体打开一个JPG图像文件,对APP0的结构进行分析和验证。
表6-06 JFIF格式中APP0域的详细结构
偏移 长度 内容 块的名称 说明
0 2 byte 0xFFD8 (Start of Image,SOI) 图像开始
2 2 byte 0xFFE0 APP0(JFIF application segment) JFIF应用资料块
4 2 bytes length of APP0 block APP0块的长度
6 5 bytes "JFIF"+"0" 识别APP0标记
11 1 byte 主要版本号(如版本1.02中的1)
12 1 byte 次要版本号(如版本1.02中的02)
13 1 byte and Y densities> X和Y的密度单位
units=0:无单位
units=1:点数/英寸
units=2:点数/厘米
14 2 bytes 水平方向图元密度
16 2 bytes 垂直方向图元密度
18 1 byte 缩略图水平图元数目
19 1 byte 缩略图垂直图元数目
3n < Thumbnail RGB bitmap> 缩略RGB点阵图(n爲缩略图的图元数)
Optional JFIF extension APP0 marker segment(s) 任选的JFIF扩展APP0标记段
…… ……
2 byte 0xFFD9 (EOI) end-of-file 图像文件结束标记
////////////////////////////////////////////////////
jpg格式分析
偏移 |
长度 |
内容 |
块的名称 |
说明 |
0 |
2 byte |
0xFFD8 |
(Start of Image,SOI) |
图像开始 |
2 |
2 byte |
0xFFE0 |
APP0(JFIF application segment) |
JFIF应用数据块 |
4 |
2 bytes |
length of APP0 block |
APP0块的长度 |
|
6 |
5 bytes |
"JFIF"+"0" |
识别APP0标记 |
|
11 |
1 byte |
<Major version> |
主要版本号(如版本1.02中的1) |
|
12 |
1 byte |
<Minor version> |
次要版本号(如版本1.02中的02) |
|
13 |
1 byte |
<Units for the X |
X和Y的密度单位 units=0:无单位 units=1:点数/英寸 units=2:点数/厘米 |
|
14 |
2 bytes |
<Xdensity> |
水平方向像素密度 |
|
16 |
2 bytes |
<Ydensity> |
垂直方向像素密度 |
|
18 |
1 byte |
<Xthumbnail> |
缩略图水平像素数目 |
|
19 |
1 byte |
<Ythumbnail> |
缩略图垂直像素数目 |
|
3n |
< Thumbnail RGB bitmap> |
缩略RGB位图(n为缩略图的像素数) |
||
Optional JFIF extension APP0 marker segment(s) |
任选的JFIF扩展APP0标记段 |
|||
…… |
…… |
|||
2 byte |
0xFFD9 |
(EOI) end-of-file |
图像文件结束标记 |
下表表示了APP0域的详细结构。有兴趣可通过UltraEdit或者PC TOOLS等工具软件打开一个JPG图像文件,对APP0的结构进行分析和验证。
JPEG文件格式的更多相关文章
- 隐写技巧——利用JPEG文件格式隐藏payload
0x00 前言 继续对图片隐写技巧的学习,这次是对JPEG文件格式的学习和理解.同PNG文件的格式对比,JPEG文件相对简单,读取其中隐藏payload的方式大同小异,两者区别在于文件格式不同,可供利 ...
- JPEG文件格式介绍
JPEG文件的存储格式有很多种,但最常用的是JFIF格式,即JPEG File Interchange Format.JPEG文件大体可以分为两个部分: (1)标记码:由两个字节构成,其中,前一个字节 ...
- 一、JPEG文件格式-----压缩框架
JPEG文件格式 http://wenku.baidu.com/view/4856d31dc281e53a5802ff0d.html 标记名 FF E0 ...
- 【转】jpeg文件格式详解
JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写.它由国际电话与电报咨询委员会CCITT(The International Telegraph ...
- JPEG解码--(1)JPEG文件格式概览
由于懒和人的忘性,以前做的一些笔记再回过头看时又有些生疏了,我决定把一些内容整理出来,以供有需要的来参考. 了解的人知道其价值所在,不知道的人就弃之如废物吧. 本篇是JPEG解码系列的第一篇--JPE ...
- JPEG图像密写研究(一) JPEG图像文件结构
[转载]转载自http://www.cnblogs.com/leaven/archive/2010/04/06/1705846.html JPEG压缩编码算法的主要计算步骤如下: (0) 8*8分块. ...
- 【转】jpg文件格式详解
JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写.它由国际电话与电报咨询委员会CCITT(The International Telegraph ...
- JPEG编码(二)
来自CSDN评论区http://bbs.csdn.net/topics/190980 1. 色彩模型 JPEG 的图片使用的是 YCrCb 颜色模型, 而不是计算机上最常用的 RGB. 关于色彩模型, ...
- JPEG编码(一)
JPEG编码介绍. 转自:http://blog.chinaunix.net/uid-20451980-id-1945156.html JPEG(Joint Photographic Experts ...
随机推荐
- English trip -- Phonics 6 元音字母 u + Unit 5 B课 review
Vowel u [ʌ] 闭音节 bunny cut bug mushroom lunch ar er ur or ir = R (读音类似儿) e.g. dollar 美元 collar n. ...
- vue.js 过渡&动画
9-17 在add ,update, remove DOM时 提供多种方式的应用过度效果. 包括以下可选工具:(2大类,css和js) 在css过度和动画中自动应用class 配合使用第三方css动画 ...
- [INS-20802] Oracle Net Configuration Assistant failed,Caught UnknownHostException
在64位Centos上安装64的oracle 11g R2,出现错误: [INS-20802] Oracle Net Configuration Assistant failed 根据提示查看日志文件 ...
- Android之RecyclerView实现时光轴
做项目的过程中有个需求需要时光轴,于是网上找了部分资料 ,写了个案例,现在分享给大家. 如图: activity_main.xml <?xml version="1.0" e ...
- Confluence 6 嵌套用户组的示例
示例 1 : 用是一个子用户组成员 想象在你的目录服务器中,存在下面 2 个用户组: staff marketing 成员: marketing 用户组是 staff 的成员. 用户 jsmith ...
- Windows下sklearn源码安装
简介 在Windows下编译sklearn源码,主要注意二点: 编译环境的搭建 编译顺序 编译环境的搭建 如果环境没有搭建好,最常见的报错,就是"error: Unable to find ...
- thinkphp3.2 输入框默认值
1,我们在做项目的时候输入框有的时候要提示用户输入什么,当用户输入值的时候也不用客户删除,用户只管输入.这里我们就用一个很简单的就OK了. <input type="text" ...
- LeetCode 48. Rotate Image My Submissions Question (矩阵旋转)
题目大意:给一个矩阵,将其按顺时针旋转90°. 题目分析:通法是先将矩阵转置,然后再反转每一行,或者是先反转每一列,然后再将其转置.I just want to say"It's amazi ...
- Unity3D中的函数方法和解释
一.刷新函数 Update 当MonoBehaviour启用时,其Update在每一帧被调用. LateUpdate 当Behaviour启用时,其LateUpdate在每一帧被调用. FixedUp ...
- Apache Spark探秘:利用Intellij IDEA构建开发环境
1)准备工作 1) 安装JDK 6或者JDK 7 或者JDK8 mac 的 参看http://docs.oracle.com/javase/8/docs/technotes/guide ...