JPEG文件中的EXIF(下)

news/2024/11/15 18:47:27/

原文链接


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'.
0 x013f
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.4142 5  = F5.6.
0x9203
BrightnessValue
signed rational
1
被拍摄对象的明度  ,  单位是  APEX.  为了从 BrigtnessValue(Bv) 计算出曝光量  (Ev),  你必须加上 SensitivityValue(Sv).
Ev=Bv+Sv   Sv=log 2  (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



http://www.ppmy.cn/news/724955.html

相关文章

【LibRaw】原始图像解码库介绍(八)——C++ API之辅助功能

辅助功能 库版本检查 const char * LibRaw :: version() 以MAJOR.MINOR.PATCH-Status格式返回LibRaw版本的字符串表示形式(即0.6.0-Alpha2或0.6.1-Release)。 int LibRaw :: versionNumber() 返回LibRaw…

数学之美学习笔记

数学之美学习笔记 第1章 文字和语言vs数字和信息第2章 自然语言处理--从规则到统计第3章 统计语言模型第4章 谈谈分词第5章 隐含马尔科夫模型第6章 信息的度量和作用第7章 贾里尼克和现代语言处理第8章 布尔代数和搜索引擎布尔代数:索引: 第9章 图论和网…

IMAGE-GUIDED NEURAL OBJECT RENDERING

IMAGE-GUIDED NEURAL OBJECT RENDERING 摘要 我们提出了一种学习的图像引导绘制技术,它结合了基于图像的绘制和基于GAN的图像合成的优点。我们的方法的目标是为虚拟和增强现实应用(例如,虚拟陈列室、虚拟旅游观光、历史文物的数字检查&…

Standalone是什么?Standalone集群的三类进程

Standalone是什么 Standalone模式是Spark自带的一种集群模式,不同于前面本地模式启动多个进程来模拟集群的环境,Standalone模式是真实地在多个机器之间搭建Spark集群的环境,完全可以利用该模式搭建多机器集群,用于实际的大数据处…

外出闯荡_外出拍摄时如何确保照片安全

外出闯荡 As a photographer, there’s nothing worse than losing your hard shot photos, whether it’s from hard drive failure, theft, or anything else. With a good backup strategy, it’s easy to keep your photos safe at home, but what about when you’re stil…

自学go语言的笔记干货

在经过3个月的Go的学习中 整理出来的比较 感觉还拿得出手。 文档资料:http://yuancao.meicx.com/d/34 书签网:https://www.bookstack.cn/ 格式化:gofmt -w hello.go 编译*指令:go build -o 123.exe main.gogo build xxx.go输入输…

【云原生丶Kubernetes】Kubernetes初体验

人生若只如初见,何事秋风悲画扇。 前言 Kubernetes 是目前最流行的容器编排工具之一,由Google开发并维护。它提供了完整的容器编排解决方案,包括自动化部署、资源管理和调度、服务发现和负载均衡等功能。 然而,对于初学者来说&a…

SpringBoot处理全局异常详解(全面详细+Gitee源码)

前言:在日常的开发工作中,项目在运行过程中多多少少是避免不了报错的,对于报错信息肯定不可以把全部信息都抛给客户端去显示,这里就需要我们对常见的七种异常情况统一进行处理,让整个项目更加优雅。 目录 一、基本介绍…