https://blog.csdn.net/shelldon/article/details/54407534

EXIF格式介绍(下)

JPEG图片中的EXIF信息是以TIFF格式保存的,关于TIFF格式的介绍,可以参考上篇。

下篇中将介绍EXIF中都保存了哪些数据,这些数据的内容和格式,最后介绍一下EXIF中的缩略图信息。

JPEG图片的EXIF数据

EXIF JPEG文件将EXIF信息存储在JFIF的APP1标记中。

EXIF主要保存拍摄照片时的相机参数、图像缩略图、GPS信息等。

EXIF在JPEG图片中的存储位置

EXIF 存储在JPEG图片的 APP1标记中,符合JFIF标准。APP1标记的格式包含三部分:标记 (0xFFE1)、数据长度、数据内容。

存储了EXIF的APP1标记通常包含:标记 (0xFFE1)、数据长度、EXIF标示符、EXIF数据。

也就是说,EXIF APP1 在数据内容起始(即紧跟数据长度之后),设置Exif标示符 (“Exif\0\0”),标示该APP1 中的数据是EXIF数据。

EXIF标示符是为了与其它也使用 APP1标记的数据(如XMP)区分。

JPEG图片中存储的EXIF如图:

Fig.1. Basic Structure of JPEG Files.

一个典型的EXIF JPEG文件

一个典型的EXIF JPEG文件结构类似下面这样:

JPEG SOI : FF D8  //  图片起始

JPEG APP1: FF E1

APP1 Size : 1C 45  //  注意:前面这三个WORD都是big endian的

EXIF Flag : 'Exif', 0, 0

---------

TIFF :

TIFF Header:

Byte Order: 'II'

Flag      : 2A 00

IFD0 offset : 08 00 00 00

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

IFD0:

Entries Count : 0B 00 // 11

DE 1:

Tag    : 0E 01  //  Image Description 图像说明

Type   : 02 00  //  ASCII

Size  : 0B 00 00 00

Value : 92 00 00 00  //  from TIFF Header

DE 2:

Tag    : 0F 01  //  Make 制造

Type   : 02 00

Size  : 06 00 00 00

Value: B2 00 00 00

DE 3:

Tag    : 10 01  //  Model 型号

Type   : 02 00

Size  : 05 00 00 00

Value: CA 00 00 00

DE 11:

Tag    : 69 87  //  EXIF IFD

Type   : 04 00  //  LONG

Size  : 01 00 00 00

Value: 1C 01 00 00  //  Offset of EXIF IFD

IFD1 Offset : 18 03 00 00  // END of IFD0

IFD0 DATA:

...  //  存放IFD0中DE 的Value数据

EXIF sub IFD :

Entries Count : 18 00

DE :

Tag    : 9A 82  //  Exposure time

...

Next IFD : 00 00 00 00  // END of EXIF IFD. 按标准IFD规定,表示没有后继IFD

EXIF sub IFD Data :

...  //  存放EXIF sub IFD的Value数据

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

IFD1 :  //  EXIF中用于存放缩略图

Entries Count : 06 00

DE :

Tag    : 03 01

...

Next IFD : 00 00 00 00  // END OF IFD1. EXIF只用到两个TIFF IFD

IFD1 Data :

... //  Thumbnail etc.

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

//  end of TIFF

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

//  其它JPEG Marker segments

JPEG EOI : FF D9  //  图片结束

我们可以简化一下,看一个只包含主要IFD和JPEG 格式的缩略图的APP1结构("Intel"字节序)。

就像上面描述的那样, Exif 数据开始于ASCII字符 "Exif" 和2个字节的0x00, 后面才是 Exif的数据.

缩略图数据存储在IFD1的数据域.

FFE1

APP1 标记

SSSS

APP1 数据

APP1 数据大小

45786966 0000

Exif 头

49492A00 08000000

TIFF 头

XXXX. . . .

IFD0 (主图像)

目录

LLLLLLLL

连接到 IFD1

XXXX. . . .

IFD0的数据域

XXXX. . . .

Exif 子IFD

目录

00000000

连接结束

XXXX. . . .

Exif 子IFD的数据域

XXXX. . . .

Interoperability IFD

Directory

00000000

连接结束

XXXX. . . .

Interoperability IFD的数据域

XXXX. . . .

Makernote IFD

Directory

00000000

连接结束

XXXX. . . .

Makernote IFD的数据域

XXXX. . . .

IFD1(缩略图像)

目录

00000000

连接结束

XXXX. . . .

IFD1的数据域

FFD8XXXX. . . XXXXFFD9

缩略图像

需要说明的是,尽管 JPEG 数据仅仅是使用 Motorola 字节序, 但 Exif 却是允许Intel字节序 和 Motorola 字节序这两种字节序存在的。

EXIF中的IFD结构

EXIF遵循TIFF文件格式,并对TIFF格式做了一些扩展。

因此EXIF也是一种非常灵活的格式,具有非常好的可扩充性,要想较好地处理其中的相关数据也是比较麻烦的。

标准的TIFF格式在 上篇中讲到。简单回顾一下TIFF格式中的IFD。

IFD是一个链表结构,如图所示。在每个IFD的末尾包含一个指向下一个IFD的偏移量(同样是从TIFF Header算起),如果这个偏移量为0,则表示已经到了链表的末尾。

           图 TIFF格式中的IFH和IFD链表结构

在Exif格式中,只有两个标准IFD。第一个IFD 是IFD0(主图像IFD), 然后它连接到IFD1(缩略图IFD) ,并且IFD 连接在此结束。IFD0/IFD1 不包含任何的数字相机的信息,例如快门速度, 焦距等.

在IFD0中除了自己的DE外,还包括了EXIF自定义的EXIF Sub IFD、GPS IFD,而EXIF sub IFD中又进一步包括了Interoperability IFD(简称IOP)和MakerNote IFD。

EXIF自定义IFD的结构与标准TIFF IFD相同,但不是记录于TIFF的IFD链表中,而是 作为TIFF IFD的子链表形式存在(因为扩展IFD里定义了不同于TIFF标准的Tag,这样为了与标准的TIFF格式区分),使得原来的TIFF IFD链表结构变成了树形结构 。

   图  EXIF IFD的树形结构

EXIF自定义IFD在IFD0中以DE Tag的方式出现,都是LONG类型,它记录了相应扩展IFD的起始位置(从TIFF Header开始的偏移)。

EXIF自定义标签编号的含义

TagID

属性名称

type

说明

8769

EXIF IFD

LONG

数字相机的信息

8825

GPS IFD

LONG

地理位置信息

A005

Interoperability IFD

LONG

互操作扩展信息

927C

MakerNote IFD

LONG

厂商自己独有的注释信息

扩展IFD中用到的Tag全部是EXIF重新定义的。 Tag的种类和数量非常之大,在EXIF规范里定义了各个Tag的支持级别,光是JPEG格式下必须支持的Tag就有十几个,再加上可选支持的Tag,有几十上百个,并且还存在未来继续扩充的可能。

具体EXIF中的Tag定义见后附表。

EXIF IFD示例

一个EXIF的二进制表示:

0000: 49 49 2A 00 08 00 00 00-02 00 1A 01 05 00 01 00

0010: 00 00 26 00 00 00 69 87-04 00 01 00 00 00 11 02

0020: 00 00 40 00 00 00 48 00-00 00 01 00 00 00

上面的是TIFF数据的开头部分, 对它的解读如下;

·      前两个字节是 "I I", 所以字节序是 'Intel'.

·      在地址0x0004~0x0007处存放的值是 0x08000000, 因此IFD0 从地址 '0x0008'开始

·      在地址0x0008~0x0009处存放的值是 0x0200, 则表示IFD0有 '2' 个目录项.

·      在地址0x000a~0x000b处存放的值是 0x1A01, 它意味着这是一个 XResolution(0x011A) 标签, 表示这是图像的水平分辨率.

·      地址0x000c~0x000d处存放的值为 0x0500, 说明数据的格式是一个 unsigned rational(0x0005).

·      地址0x000e~0x0011处存放的值是 0x01000000, 说明组件的数据只有 '1'个. Unsigned rational的数据大小是8字节(组件的大小), 因此数据的总长度是 1x8=8字节.

·      总数居长度比4字节大了, 因此它后面的4个字节里面存放的是一个指向实际数据的偏移量地址.

·      地址0x0012~0x0015处存放的是 0x26000000, 表示XResolution(水平分辨率) 数据的存储地址是0x0026

·      地址0x0026~0x0029处存放的数据是 0x48000000, 说明分子的值为 72, 而地址0x002a~0x002d 处存放的是0x0100000000, 说明分母为 '1'. 因此XResoultion 的值是 72/1.

·      地址0x0016~0x0017处存放的数据为0x6987, 表示下一个标签是 ExifOffset(0x8769). 这就是 指向 Exif子IFD的偏移量

·      而它的数据格式是 0x0004, 即是一个无符号的长整形(unsigned long integer).

·      这个标签只有一个组件. 无符号长整形的数据大小是4字节, 因此总数据长度为4字节.

·      总数据长度是 4字节, 则说明下一个4字节的数据中存放的是Exif子IFD的偏移量.

·      地址0x001e~0x0021处存放的是 0x11020000, 则说明Exif子IFD的开始地址是 '0x0211'.

·      这是最后一个目录项, 接下来的4个字节存放的是下一个IFD的偏移地址.

·      地址0x0022~0x0025处存放的是 0x40000000, 就可以知道下一个IFD的开始地址为 '0x0040'

EXIF中的缩略图

Exif格式中包含缩略图像(除了Ricoh RDC-300Z). 通常它被放到IFD1的后面.缩略图有 3 种格式; JPEG 格式(JPEG 使用YCbCr), RGB TIFF 格式, YCbCr TIFF 格式.

在Exif2.1之后推荐使用JPEG 格式和160x120像素的尺寸. 根据 DCF 规格, 缩略图像 必须 使用JPEG 格式以及图像的尺寸 固定为160x120 像素.

JPEG格式的缩略图

IFD1中的标签Compression(0x0103) 如果是'6', 则缩略图就是JPEG格式。几乎所有的 Exif图像中缩略图都使用JPEG 格式。

在这种情况下, 你能从IFD1的 JpegIFOffset(0x0201) 标签中得到缩略图的偏移量, 从标签 JpegIFByteCount(0x0202)中得到缩略图的大小。数据格式则是普通的 JPEG 格式,也就是从SOI(0xFFD8)开始在EOI(0xFFD9)结束。

TIFF格式的缩略图

IFD1的标签Compression(0x0103)如果是 '1', 则缩略图的格式就没有经过压缩的 (就是TIFF 图像).

缩略图数据的开始点是标签 StripOffset(0x0111) , 缩略图的尺寸 就是标签  StripByteCounts(0x0117) 之和.

如果缩略图使用非压缩格式并且IFD1中的标签  PhotometricInterpretation (0x0106)是 '2', 则缩略图使用了 RGB 格式.

在这种情况下, 你只要简单的把数据拷贝到计算机的RGB格式 中就能看到缩略图了(如 BMP 格式. 注意TIFF中存储的像素数据是'RGB' 顺序的, 而 BMP 里的存储顺序则是 'BGR' .

如果IFD1中的标签 PhotometricInterpretation(0x0106)  的值是 '6', 缩略图使用 YCbCr 格式. 如果你想要看到缩略图的话, 你必须把它 转换成 RGB 格式的.

EXIF中图片旋转标志

在拍摄照片时,不可避免的会旋转相机、手机从不同的角度牌照。因此,EXIF中保存了图片的旋转信息。

图 拍摄照片时的相机旋转表示

Oritention Flag的取值范围是1-8,实际上对于照片,只会出现1、8、3和6四个值。

各值的意义如下:

EXIF Orientation

翻转方式

1

未翻转

2*

左右翻转

3

180度旋转

4*

上下翻转

5*

左旋转90度后上下翻转

6

右旋转90度

7*

右旋转90度后上下翻转

8

左旋转90度

注意:带“*”号的基本不会出现,因为用相机拍摄照片时,没法做“镜像翻转”这样的操作。

解析JPEG图片中的EXIF

很多开源库中有现成的EXIF解析方法,这里推荐OpenCV中的EXIF解析(opencv-3.1.0):

文件:modules/imgcodecs/src/jpeg_exif.cpp

方法:ExifReader::getExif()

在Windows上,还可以通过PhotoMe软件,直观的看到JPEG图片的EXIF信息。

附  Exif使用的 TAG

下面显示了 Exif/TIFF 使用的标签。如果这个标签组件数目的上限, CompoNo 一栏就代表这一数值。如果这个数值没有,则说明这儿没有上限值。

IFD0 ( 主图像) 使用的标签

标签号

标签名

格式

组件数

描述

0x010e

ImageDescription

ascii string

用来描述图像 . 双字节的字符码不能使用 , 如 中文 /韩文 /日文 .

0x010f

Make

ascii string

表示数字相机的制造商 . 在 Exif 标准中 , 这个标签是可选的     , 但是在 DCF中它是必需的 .

0x0110

Model

ascii string

表示数字相机的模块代码 . 在 Exif 标准中 , 这个标签是可选的 , 但在 DCF中它也是必需的 .

0x0112

Orientation

unsigned short

1

Value

0th Row

0th Column

1

top

left side

2

top

right side

3

bottom

right side

4

bottom

left side

5

left side

top

6

right side

top

7

right side

bottom

8

left side

bottom

当拍照时 , 相机相对于场景的方向 . 在右边表示的是 '0th row' 以及 '0th column' 在视觉位置上的关系 .

0x011a

XResolution

unsigned rational

1

图像的 显示 /打印 分辨率 . 缺省值是 1/72英寸 , 但是它没有意义因为个人 PC在 显示 /打印 图像的时候不使用这个值 .

0x011b

YResolution

unsigned rational

1

0x0128

ResolutionUnit

unsigned short

1

XResolution(0x011a)/YResolution(0x011b) 的单位. '1'      表示没有单位 , '2' 意味着英寸 , '3' 表示厘米 . 缺省值是'2'(英寸 ).

0x0131

Software

ascii string

显示固件的版本号 (数字相机的内部控制软件 ).

0x0132

DateTime

ascii string

20

图像最后一次被修改时的日期 /时间 . 日期的格式是"YYYY:MM:DD HH:MM:SS"+0x00, 一共 20个字节 . 如果没有设置时钟或者数字相机没有时钟 , 则这个域是用空格来填充 . 通常 , 它和 DateTimeOriginal(0x9003) 具有相同的值

0x013e

WhitePoint

unsigned rational

2

定义图像白点 (white point/白点:在彩色分色、照相或摄影时作为色彩平衡测量用途的参考点 ) 的色度 (chromaticity).      如果图像是用 CIE标准照度 D65(著名的是 '光线/daylight'的国际标准 ), 这个值是'3127/10000,3290/10000'.

0x013f

PrimaryChromaticities

unsigned rational

6

定义图像的原始色度 . 如果图像使用 CCIR 推荐 709原始色度 , 则这个值是'640/1000,330/1000,300/1000,600/1000,150/1000,0/1000'.

0x0211

YCbCrCoefficients

unsigned rational

3

当图像的格式是 YCbCr(JPEG的格式 ), 这个值表示转换成RGB格式的一个常量 . 通常 , 这个值是'0.299/0.587/0.114'.

0x0213

YCbCrPositioning

unsigned short

1

当图像的格式是 YCbCr 并且使用 '子采样/Subsampling'(色度数据的剪切值 , 所有的数字相机都使用     ), 定义了 subsampling 像素阵列的色度采样点 . '1'表示像素阵列的中心 , '2' 表示基准点 .

0x0214

ReferenceBlackWhite

unsigned rational

6

表示黑点 (black point)/白点 的参考值 . 在 YCbCr 格式中     ,前两个值是 Y的黑点 /白点 , 下两个值是 Cb, 最后两个值是Cr. 而在 RGB 格式中 , 前两个表示 R的黑点 /白点 , 下两个是 G, 最后两个是 B.

0x8298

Copyright

ascii string

表示版权信息

0x8769

ExifOffset

unsigned long

1

Exif 子IFD 的偏移量

Exif IFD 使用的标签

标签号

标签名

格式

组件数

描述

0x829a

ExposureTime

unsigned      rational

1

曝光时间 (快门速度的倒数 ). 单位是秒 .

0x829d

FNumber

unsigned      rational

1

拍照时的光圈 F-number(F-stop).

0x8822

ExposureProgram

unsigned      short

1

拍照时相机使用的曝光程序 . '1' 表示手动曝光 , '2' 表示正常程序曝光 , '3' 表示光圈优先曝光 , '4' 表示快门优先曝光 , '5' 表示创意程序 (慢速程序 ), '6' 表示动作程序 (高速程序 ), '7'表示 肖像模式     , '8' 表示风景模式 .

0x8827

ISOSpeedRatings

unsigned      short

2

CCD 的感光度, 等效于 Ag-Hr 胶片的速率 .

0x9000

ExifVersion

undefined

4

Exif 的版本号. 用4 个ASCII 字符来存储 . 如果图片是基于 Exif V2.1的 , 这个值是 "0210". 因为它不是一个用 NULL(0x00)来终结的字符串,所以这里的类型是 'undefined'.

0x9003

DateTimeOriginal

ascii string

20

照片在被拍下来的日期 /时间 . 使用用户的软件是不能被修改这个值的 . 日期的格式是 "YYYY:MM:DD HH:MM:SS"+0x00, 一共占用20 个字节 . 如果数字相机没有设置时钟或者 数字相机没有时钟     , 这个域使用空格来填充 . 在 Exif标准中 , 这个标签是可选的 , 但是在 DCF中是必需的 .

0x9004

DateTimeDigitized

ascii string

20

照片被数字化时的日期 /时间 . 通常 , 它与DateTimeOriginal(0x9003) 具有相同的值. 数据格式是"YYYY:MM:DD HH:MM:SS"+0x00, 一共占用 20个字节 . 如果数字相机没有设置时钟或者 数字相机没有时钟 , 这个域使用空格来填充 . 在 Exif标准中 , 这个标签是可选的 , 但是在 DCF中是必需的 .

0x9101

ComponentsConfiguration

undefined

表示的是像素数据的顺序 . 大多数情况下 RGB格式使用'0x04,0x05,0x06,0x00' 而 YCbCr 格式使用'0x01,0x02,0x03,0x00'. 0x00:并不存在 , 其他的对应关系为0x01:Y, 0x02:Cb, 0x03:Cr, 0x04:Red, 0x05:Green, 0x06:Bllue.

0x9102

CompressedBitsPerPixel

unsigned      rational

1

JPEG ( 粗略的估计) 的平均压缩率 .

0x9201

ShutterSpeedValue

signed rational

1

用 APEX表示出的快门速度 . 为了转换成原始的 'Shutter Speed'; 则先要计算 2的 ShutterSpeedValue次幂 , 然后求倒数 . 例如 , 如果 ShutterSpeedValue 是 '4', 快门速度则是1/(2     4)=1/16 秒.

0x9202

ApertureValue

unsigned      rational

1

拍照时镜头的光圈 . 单位是 APEX. 为了转换成普通的 F-number(F-stop), 则要先计算出根号 2 2 (=1.4142)的ApertureValue次幂 . 例如 , 如果 ApertureValue 是 '5', F-number 就等于 1.41425  = F5.6.

0x9203

BrightnessValue

signed rational

1

被拍摄对象的明度 , 单位是 APEX. 为了从BrigtnessValue(Bv)计算出曝光量 (Ev), 你必须加上SensitivityValue(Sv).
Ev=Bv+Sv   Sv=log2 (ISOSpeedRating/3.125)
ISO100:Sv=5, ISO200:Sv=6, ISO400:Sv=7, ISO125:Sv=5.32.

0x9204

ExposureBiasValue

signed rational

1

照片拍摄时的曝光补偿 . 单位是 APEX(EV).

0x9205

MaxApertureValue

unsigned      rational

1

镜头的最大光圈值 . 你可以通过计算根号 2的MaxApertureValue次幂来转换成普通的光圈 F-number (跟ApertureValue:0x9202 的处理过程一样).

0x9206

SubjectDistance

signed rational

1

到焦点的距离 , 单位是米 .

0x9207

MeteringMode

unsigned      short

1

曝光的测光方法 . '0' 表示未知 , '1' 为平均测光 , '2' 为中央重点测光 , '3' 是点测光 , '4' 是多点测光 , '5' 是多区域测光 , '6' 部分测光 , '255' 则是其他 .

0x9208

LightSource

unsigned      short

1

光源 , 实际上是表示白平衡设置 . '0' 意味着未知 , '1'是日光 , '2'是荧光灯 , '3' 白炽灯 (钨丝 ), '10' 闪光灯 , '17' 标准光 A, '18' 标准光 B, '19' 标准光 C, '20' D55, '21' D65, '22' D75, '255' 为其他 .

0x9209

Flash

unsigned      short

1

'0' 表示闪光灯没有闪光 , '1' 表示闪光灯闪光 , '5' 表示闪光但没有检测反射光 , '7' 表示闪光且检测了反射光 .

0x920a

FocalLength

unsigned      rational

1

拍摄照片时的镜头的焦距长度 . 单位是毫米 .

0x927c

MakerNote

undefined

制造商的内部数据 . 一些制造商如 Olympus/Nikon/Sanyo 等在这个区域中使用 IFD 格式的数据 .

0x9286

UserComment

undefined

存储用户的注释 . 这个标签允许使用两字节的德字符或者unicode. 前 8 个字节描述的是字符集 . 'JIS' 是日文 (著名的有Kanji).
'0x41,0x53,0x43,0x49,0x49,0x00,0x00,0x00':ASCII
'0x4a,0x49,0x53,0x00,0x00,0x00,0x00,0x00':JIS
'0x55,0x4e,0x49,0x43,0x4f,0x44,0x45,0x00':Unicode
'0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00':Undefined

0x9290

SubsecTime

ascii string

一些数字相机每秒能拍摄 2~30 张照片 , 但是DateTime/DateTimeOriginal/DateTimeDigitized 标签只能记录到秒单位的时间 . SubsecTime 标签就是用来记录秒后面的数据     (微秒 ).
例如 , DateTimeOriginal = "1996:09:01 09:15:30", SubSecTimeOriginal = "130", 合并起来的原始的拍摄 时间就是           "1996:09:01 09:15:30.130"

0x9291

SubsecTimeOriginal

ascii string

0x9292

SubsecTimeDigitized

ascii string

0xa000

FlashPixVersion

undefined

4

存储 FlashPix 的版本信息 . 如果图像数据是基于 FlashPix formar Ver.1.0, 则这个值为 "0100". 因为它不是一个用NULL(0x00)来终结的字符串,所以这里的类型是 'undefined'.

0xa001

ColorSpace

unsigned      short

1

定义色彩空间 . DCF 图像必须使用 sRGB 色彩空间因此这个值总是 '1'. 如果这个照片使用了 其他的色彩空间 , 这个值是'65535':未校准 (Uncalibrated).

0xa002

ExifImageWidth

unsigned      short/long

1

主图像的尺寸大小 .

0xa003

ExifImageHeight

unsigned      short/long

1

0xa004

RelatedSoundFile

ascii string

如果数字相机能够纪录图像的音频数据 , 则表示音频数据的名字 .

0xa005

ExifInteroperabilityOffset

unsigned      long

1

表示这是一个扩展 "ExifR98", 细节未知. 这个值经常是 IFD格式的数据 . 当前这儿有两个 目录项 , 第一个是 Tag0x0001, 值是"R98", 下一个是 Tag0x0002, 它的值为 "0100".

0xa20e

FocalPlaneXResolution

unsigned      rational

1

表示 CCD的像素密度 . 如果你的相机是百万像素的并且是用低分辨率 (如 VGA模式 ) 来拍摄照片 , 这个值可以通过照片的分辨率来重新采样 . 在这种情况下 , FocalPlaneResolution 就不是CCD 的实际的分辨率 .

0xa20f

FocalPlaneYResolution

unsigned      rational

1

0xa210

FocalPlaneResolutionUnit

unsigned      short

1

FocalPlaneXResoluton/FocalPlaneYResolution 的单位 . '1' 表示没有单位 , '2'是英寸 inch, '3' 表示厘米 .

注意 :一些 Fujifilm的数码相机 (如.FX2700,FX2900,Finepix4700Z/40i 等) 使用的值是 '3' 所以它的单位一定是 '厘米 ' , 但是它们的分辨率单位就变成'8.3mm?'(1/3in.?). 这是Fuji 的 BUG? 从Finepix4900Z 开始这个值就使用 '2' 了但仍然跟实际的值不吻合 .

0xa215

ExposureIndex

unsigned      rational

1

跟 ISOSpeedRatings(0x8827)一样但是数据类型是 unsigned      rational. 只有 Kodak的数字相机使用 这个标签来替代ISOSpeedRating, 我不知道这是为什么 (历史原因 ?).

0xa217

SensingMethod

unsigned      short

1

表示图像传感器单元的类型 . '2' 意味着这是一个芯片颜色区域传感器 , 几乎所有的数字相机都 使用这个类型 .

0xa300

FileSource

undefined

1

显示图像来源 . 值 '0x03' 表示图像源是数字定格相机 .

0xa301

SceneType

undefined

1

表示拍摄场景的类型 . 值 '0x01' 表示图像是通过相机直接拍摄出来的 .

0xa302

CFAPattern

undefined

表示色彩过滤阵列 (CFA) 几何模式 .

长度

类型

意义

2

short

Horizontal repeat pixel unit = n

2

short

Vertical repeat pixel unit = m

1

byte

CFA value[0,0]

:

:

:

1

byte

CFA value[n-1,0]

1

byte

CFA value[0,1]

:

:

:

1

byte

CFA value[n-1,m-1]

色彩过滤和 CFA值之间的关系 .

Filter Color

Red

Green

Blue

Cyan

Magenta

Yellow

White

CFA value

0

1

2

3

4

5

6

R

G

G

B

例如 , 普通的 RGB 过滤器使用左表的副本 , 这个值是'0x0002,0x0002,0x00,0x01,0x01,0x02'.

Interoperability IFD 使用的标签

标签号

标签名

格式

组件号

描述

0x0001

InteroperabilityIndex

Ascii string

4

如果这个 IFD 是主图像的 IFD 并且文件内容采用的是ExifR98 v1.0, 那这个值就是 "R98". 如果是所略图的 , 这个值则是 "THM".

0x0002

InteroperabilityVersion

Undefined

4

纪录 interoperability的版本 . "0100" 表示版本1.00.

0x1000

RelatedImageFileFormat

Ascii string

any

纪录图像文件的文件格式 . 这个值是 ascii 字符串 (如 . "Exif JPEG Ver. 2.1").

0x1001

RelatedImageWidth

Short or Long

1

纪录图像的大小尺寸 .

0x1001

RelatedImageLength

Short or Long

1

IFD1 ( 缩略图) 使用的标签

标签号

标签名

格式

组件数

描述

0x0100

ImageWidth

unsigned short/long

1

表示缩略图的大小 .

0x0101

ImageLength

unsigned short/long

1

0x0102

BitsPerSample

unsigned short

3

当图像格式没有经过压缩 , 这个值表示每像素的比特位的数目 . 通常这个值是 '8,8,8'

0x0103

Compression

unsigned short

1

代表压缩的方式 . '1' 表示非压缩 , '6' 表示 JPEG 压缩格式 .

0x0106

PhotometricInterpretation

unsigned short

1

表示图像数据组件的色彩空间 . '1' 意味着单色 , '2'表示           RGB, '6' 表示 YCbCr.

0x0111

StripOffsets

unsigned short/long

如果图像格式没有经过压缩 , 这个值表示的是到图像数据的偏移量 . 在图像数据被分割的 情况下它有多个值 .

0x0115

SamplesPerPixel

unsigned short

1

如果图像格式没有经过压缩 , 这个值表示每个像素中存储的组件数目 . 在彩色图像中 , 此值为 '3'.

0x0116

RowsPerStrip

unsigned short/long

1

如果图像格式没有经过压缩 并且 图像被分割存储 , 这个值表示每条数据带存储了多少行数据 . 如果图像没有被分割 , 它与 ImageLength(0x0101) 同值.

0x0117

StripByteConunts

unsigned short/long

如果图像格式没有经过压缩 并且 图像被分割存储 , 这个值表示每条数据带使用了多少字节的 数据 且 有多个值 .      如果图像没有被分割 , 它只有一个且表示为图像的所有数据的大小 .

0x011a

XResolution

unsigned rational

1

图像的显示 /打印分辨率 . 很多的数字相机都使用1/72英寸的规格 , 但对于个人 PC 来讲这个值没有任何意义因为在显示 /打印的时候不使用这个值 .

0x011b

YResolution

unsigned rational

1

0x011c

PlanarConfiguration

unsigned short

1

如果图像格式是非压缩 YCbCr的 , 这个值表示YCbCr数据的字节对齐顺序 . '1', 表示 Y/Cb/Cr值是一个 chunky format, 对于每个子采样像素都是连续的 . '2', 则表示 Y/Cb/Cr 值被分割存储在 Y plane/Cb plane/Cr plane 格式中 .

0x0128

ResolutionUnit

unsigned short

1

XResolution(0x011a)/YResolution(0x011b) 的单位. '1' 表示英寸 , '2' 表示厘米.

0x0201

JpegIFOffset

unsigned long

1

当图像格式是 JPEG时 , 这个值表示到 JPEG 数据的偏移量 .

0x0202

JpegIFByteCount

unsigned long

1

当图像格式是 JPEG时 , 表示 JPEG 图像的数据大小 .

0x0211

YCbCrCoefficients

unsigned rational

3

当图像格式是 YCbCr时 , 它表示转换成 RGB格式的一个常量值 . 通常是 '0.299/0.587/0.114'.

0x0212

YCbCrSubSampling

unsigned short

2

当图像格式是 YCbCr时 并且 使用子采样 (色度数据的剪切值 , 所有的数字相机都使用 )时 , 这个值表示有多少个色度数据被采样了 . 首先第一个值表示水平的 , 下一个值表示垂直的 采样率 .

0x0213

YCbCrPositioning

unsigned short

1

当图像格式是 YCbCr时 并且 使用子采样 (色度数据的剪切值 , 所有的数字相机都使用 )时 , 这个值定义了被采样的像素阵列的色度采样点 . '1' 表示像素阵列的中心 , '2' 表示基准点 (0,0).

0x0214

ReferenceBlackWhite

unsigned rational

6

表示黑点 /白点的参考值 . 在 YCbCr 格式的情况下 , 前两个表示了 Y的黑 /白 , 下两个是 Cb, 最后两个是 Cr. 在 RGB 的情况下 , 前两个表示 R的黑 /白 , 下两个是G, 最后两个是 B.

参考

http://www.exif.org/Exif2-2.PDF

http://dev.exiv2.org/projects/exiv2/wiki/The_Metadata_in_JPEG_files

http://mental.we8log.com/mental/entry/29/my_weblog

http://www.cppblog.com/lymons/archive/2013/06/09/108266.html

JPEG系列二 JPEG文件中的EXIF(下)相关推荐

  1. JPEG系列二 JPEG文件中的EXIF(上)

    JPEG图片中的EXIF信息遵循TIFF格式标准,因此EXIF分为上下两篇. 上篇介绍一下TIFF文件格式,下篇介绍EXIF在JPEG中的作用和存储的信息. TIFF文件格式简介 TIFF - Tag ...

  2. JPEG系列二 JPEG文件中的EXIF(下)

    EXIF格式介绍(下) JPEG图片中的EXIF信息是以TIFF格式保存的,关于TIFF格式的介绍,可以参考上篇. 下篇中将介绍EXIF中都保存了哪些数据,这些数据的内容和格式,最后介绍一下EXIF中 ...

  3. Linux学习系列二:Linux中的常用命令

    这个系列的Linux教程主要参考刘遄老师的<Linux就该这么学>.用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间 ...

  4. CompactExifLib:访问JPEG文件中的EXIF标签

    目录 介绍 背景 演示应用程序 使用代码 读写标签 标签ID和图像文件目录(IFD) 标签类型 整数 数组标签 字符串 有理数 日期和时间 原始数据和字节顺序 移除标签 加载和保存EXIF数据 GPS ...

  5. JPEG文件中的EXIF(下)

    原文链接 EXIF格式介绍(下) JPEG图片中的EXIF信息是以TIFF格式保存的,关于TIFF格式的介绍,可以参考上篇. 下篇中将介绍EXIF中都保存了哪些数据,这些数据的内容和格式,最后介绍一下 ...

  6. JPEG系列三 JPEG图像压缩

    转载自 www.thecodeway.com http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/ JPEG压缩算法之前已有很多前辈详细讲解过,我 ...

  7. JPEG系列一 JPEG图片的文件格式

    JPEG图片的文件格式 互联网上广泛使用的image/jpeg 图片,准确来说,全称应该叫做使用 JPEG标准压缩图像,使用JFIF标准封装图像数据的图形文件. JPEG 是一个压缩标准,JFIF 是 ...

  8. JPEG系列一 JPEG图片的文件格式

    https://blog.csdn.net/shelldon/article/details/54144406 JPEG图片的文件格式 互联网上广泛使用的image/jpeg 图片,准确来说,全称应该 ...

  9. JPEG系列四 JPEG图像压缩优化

    JPEG中使用了量化.哈夫曼编码等,极大的压缩了图片占用的空间,那么是否可以进一步压缩呢? 从技术角度讲,是可以的.如DropBox开源的lepton,在目前的JPEG压缩基础上,可以再节省22%左右 ...

最新文章

  1. 【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序
  2. [leetcode] 22. Generate Parentheses
  3. Python~第三方模块
  4. 星巴克人造肉产品来了,植物牛肉餐品真香?
  5. 物联网工业串口转WiFi模块 无线路由WiFi模块的选型
  6. 比CMD更强大的命令行:WMIC后渗透利用(系统命令)
  7. OllyDBG V1.10聆风听雨汉化版
  8. Longhorn入门级教程!轻松实现持久化存储!
  9. 使用iperf工具,用java的swing,编写网络带宽监测小工具
  10. 2021总结及智能设备汇总
  11. vue 开发ui库_面向设计师的ui ux开发vue js
  12. python网络数据采集学习笔记(二)
  13. 未接响铃1秒是什么意思_18650锂电池3C到底是什么意思?看了秒懂
  14. raspberry pi_我如何从Mac Mini迁移到Raspberry Pi
  15. z490 linux raid,PC硬件与外设 篇二十三:光威弈系列Pro Z490平台装机评测(含raid模式)...
  16. html添加实时视频的代码,关于添加网页视频的html代码
  17. python中大批量m3u8文件合并总结
  18. 三星手机如何升级android4.1系统,三星GALAXY S Ⅲ迎来安卓4.1升级
  19. 无锡市计算机培训短期速成班,锡山区电脑培训速成班培训快速学习电脑办公制图班...
  20. python 完全面向对象_python面向对象实战

热门文章

  1. 解决Notepad++ Plugin Manager无法加载插件的方法
  2. 导入自己模块包导入报错:ModuleNotFoundError: No module named ‘xxx‘解决方法 晓物智联
  3. CD网站用户消费数据分析案例
  4. 【腾讯Bugly干货分享】Android进程保活招式大全
  5. eclispe启动报错
  6. 由浅入深的前端面试题 和矫情的“浪漫主义”诗句
  7. linux网络安装pxe及无人值守安装
  8. 对话框AlertDialog的基本使用(新手)
  9. 解决IDEA中pom.xml中不能自动加载jar包
  10. 免越狱中控你们知道多少呢?