JPEG文件格式 JFIF & Exif
来源:互联网 发布:行政单位oa软件 编辑:程序博客网 时间:2024/06/05 17:56
JPEG是Joint Photographic Experts Group 的缩写,正是这个专家组制定了JPEG标准以及其他静态图片编解码标准。Joint(联合)是指ISO TC97 WG8(计算机与信息处理技术委员会 第8工作组)和CCITT SGVIII两个工作组的联合. 这个专家组在1992年颁布了第一个JPEG标准, ITU在1992年命名为ITU-T Recommendation T.81, ISO/IEC在1994年命名为10918-1
注意JPEG标准仅仅说明定义了codec部分, 也就是图片如何压缩为字节流以及重新解码为图片的过程. 标准没有涉及到文件的存储格式.
JPEG标准的附录B定义了文件格式"JPEG Interchage Format"(JIF), 不过这个文件格式很少被用到, 主要是因为Encoders和Decoders完整实现JIF很困难, 此外这个标准还缺少以下几个方面:
- Color space定义
- Component sub-sampling 限制
- 像素宽高比
因此其他的JPEG文件格式标准陆续出现了.1992年颁布了JPEG File Interchange Format(JFIF),紧接着出现了Exchange image file format(Exif)和ICC color profiles. 这些格式都符合JIF的字节layout,但是又增加了一些不同的markers.在某种程度上说,JFIF是JIF标准的精简版本.
Exif JPEG文件格式主要用在摄像设备上,摄像产业把Exif作为行业的元数据交换格式.由于Exif标准不支持color profiles,所以大部分软件图像编辑软件使用JFIF格式存储JPEG码流.
不论是Exif还是JFIF格式,都遵守JPEG interchange format(JIF),他们都是由JPEG marker和compressed data组成的.下面列出了JPEG的所有marker
表1 JPEG 的marker定义
表2 JPEG Start of Frame marker结构
表3 JPEG Start of Scan
表4 JEPG APP0 应用程序保留标记0
字段长度
Comments
标记代码 marker2 bytes固定值0xFF, 0xE0数据长度 length2 bytesAPP0总长度,不过括marker,但是包括length标识符 identifier5 bytes固定的字符串"JFIF\0"版本号 version2 bytes一般为0x0101或者0x0102像素单位 unit1 bytes坐标单位,0没有单位; 1 pixel/inch;2 pixel/cm水平像素数目 Xdensity2 bytes 垂直像素数目 YDensity2 bytes 缩略图水平像素数目1 byte 缩略图垂直像素数目1 byte 缩略图RGB位图3n bytesn = Xthumbnail * Ythumbnail, 这是一个24bits/piexl的RGB位图
表5 APPn 应用程序保留标记
字段长度
Comments标记代码 marker2 bytes固定值0xFFE1 ~ 0xFFEF, n=1~15数据长度 length2 bytesAPPn的总长度,不包括marker的2bytes详细信息(length - 2) bytes内容是应用特定的,比如Exif使用APP1来存放图片的metadata,Adobe Photoshop用APP1和APP13两个标记段分别存储了一副图像的副本。
表6 DQT Define Quantization Table
字段长度Comments标记代码 marker 2 bytes固定值0xFF, 0xDB量化表长度 length 2 bytesDQT的总长度,不包括marker的2bytes量化表 (length-2)bytes 精度及量化表ID1 bytes高4位:精度,只有两个可选值,0 8bits,1 16bits;
低4位:量化表ID,取值范围为0~3 表项64*(精度+1) bytes
EOI marker
End of Image, 图像结束marker,一般来说EOI在JPEG文件的末尾处,但是有的JPEG会在EOI之后添加一些内容。
0xFF在JPEG文件中具有标记性的含义,后一个字节则根据不同意义有不同数值,在每个标记码之前还可以添加书目不限的无意义的0xFF填充,也就是说连续的多个0xFF可以理解为一个0xFF,并表示一个标记码的开始。
注意由于compressed data(jpeg压缩数据流)中可能出现0xFF的,为了和marker区分开,就需要特殊处理。具体的做法是在0xFF后添加一个没有意义的0x00。如果在图像数据流中遇到0xFF,检测紧接着的字符,处理规则如下:
1) 0x00,则表示0xFF是图像流的组成部分。
2) 0xD9,则与0xFF共同组成EOI标记,图像流结束,同时图像文件结束。
3) 0xD0~0xD7,则组成RSTn标记,则要忽视真个RSTn标记,即不对当强的0xFF和紧接着的0xDn两个字节进行译码,并按照RST标记的规则调整译码变量。
4) 0xFF,忽视当前的0xFF,对后一个0xFF在做判断
5) 其他数值,则忽视当前的0xFF,并把紧接着的数值用于译码
JFIF - JPEG FILE Interchange Format
JFIF是为了使得JPEG 码流能够在广泛的平台和应用见进行交换的最小文件格式.这个最小文件格式不包括TIFF JPEG标准任何高级特性,以及任何应用特定的文件格式.这种简化格式的初衷就是为了方便JPEG压缩图像的交换.
JFIF语法符合ISO DIS 10918-1附录B中关于交换文件语法的定义.此外,JFIF 使用APP0 marker来实现JFIF特定于JIF的部分
JFIF格式文件的 layout:
- 0xFF, 0xD8 SOI, Start of Image
- 0xFF, 0xE0 APP0, length, identifies, version, units, Xdensity, YDensity, Xthumbnail, Ythunbnail, (RGB)n
- length 2 bytes: 这个APP0域的长度,包括长度字段本身的2 bytes,但是不包括APP0 marker自身
- identifier 5 bytes: 0x4A, 0x46, 0x49, 0x46, 0x00. 字符串"JFIF"
- version 2 bytes: 版本号,一般为0x0102 或者0x0101,也就是1.01或者1.02
- units 1 bytes: 坐标的单位,units=0: 没有单位;units=1: 每英寸一个点;units=2 每厘米一个点
- Xdensity 2 bytes: 水平像素数
- Ydensity 2 bytes: 垂直像素数
- Xthumbnail 1 bytes: Thumbnail水平像素数
- Ythumbnail 1 bytes: Thumbnail垂直像素数
- (RGB)n 3n bytes: 打包的24bits RGB thumbnail像素 n = Xthumbnail*Ythumbnail
- [可选的JFIF扩展APP0 marker段]
- ...
- ...
- 0xFF, 0xCn SOFn(Start of Frame), length, frame paramters
- ...
- ...
- 0xFF, 0xD9 EOI (End of Image)
Exif - Exchange Image File Format
这个标准是Camera产业联合会发布的,主要目的就是设计一种文件格式,方便交换照片文件的metadata
Exif文件的layout
- SOI 0xFF, 0xD8 Start of frame
- APP1 0xFF, 0xE1 Exif Attribute Information
- APP2 0xFF, 0xE2 Flashpix Externsion data
- ...
- APPz 0xFF, 0xEn
- DQT 0xFF, 0xDB
- DHT 0xFF, 0xC4
- DRI 0xFF, 0xDD
- SOF 0xFF, 0xC0(0xFF, 0xC2)
- SOS 0xFF, 0xDA
- Compressed Data
- EOI 0xFF, 0xD9
- JPEG文件格式 JFIF & Exif
- JPEG文件格式 JFIF & Exif
- JPEG JFIF
- JFIF文件格式
- JFIF文件格式
- JPEG 简易文档 V2.11 / JFIF文件格式即JPEG文件交换格式(JPEG File Interchonge Format)
- 读取和修改JPEG图片文件的头信息EXIF和JFIF
- JFIF-JPEG文件
- JFIF-JPEG文件
- IOS修改:Exif、JFIF、TIFF
- JPEG exif
- Exif文件格式
- Jpg, Jpeg, Exif
- JPEG Exif 学习
- JPEG: Exif信息相关
- JFIF格式的Jpeg属性读取
- jpeg文件格式
- jpeg文件格式
- Mac OS上怎么一个Eclipse打开多个工作空间
- Hive2.0 在 Hadoop2.7部署 (2017.03添加异常处理)(图文解说)
- cache coherence 概念
- ng2搭建系统-Accordion可折叠的面板
- myclipse tomcat启动出错
- JPEG文件格式 JFIF & Exif
- 17.3.9 caffe自定义一个Layer会遇到的一些理解方面的问题
- 使用FCN做图像语义分割
- SpringMVC 页面回显和URL模板映射
- git中出现sign_and_send_pubkey: signing failed: agent refused operation【已解决】
- Google Guice
- 215. Kth Largest Element in an Array(第三周)
- js-1
- 自己学习中的知识点(2)---jdk8 时间新特性