图像元数据(Metadata) ——Exif信息分析
文章目录1、元数据1. 图片元数据2. 如何查看元数据2、图像Exif信息2.1 简介2.1 JPG文件结构2.2 Exif与TIFF的关系2.3 Exif元数据2.4 总结3、Exif工具3.1 Pillow库3.2 exiv23.3 exifread库3.4 piexif库4、Exif记录的信息(标签)参考文献1、元数据元数据(Matedata),又称中介数据、中继数据,为描述数据的数据(..
文章目录
1、元数据
元数据(Matedata
),又称中介数据、中继数据,为描述数据的数据(data about data
),主要是描述数据属性(property
)的信息。用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
元数据是关于数据的组织、数据域及其关系的信息,简言之,元数据就是关于数据的数据。(来自百度百科)
1. 图片元数据
图片元数据(Metadata) 是嵌入到图片文件中的一些标签。比较像文件属性,但是种类繁多。对于数码图像,目前常见的研数据有EXIF, IPTC和XMP
三种:
EXIF
:通常被数码相机在拍摄照片时自动添加,比如相机型号、镜头、曝光、图片尺寸等信息IPTF
:比如图片标题、关键字、说明、作者、版权等信息。主要是由人工在后期通过软件写入的数据。XMP
:XMP
实际上是一种元数据存储和管理的标准,可以将Exif,IPTC
或其他的数据都按XMP统一的格式存放在图像文件中。
元数据的嵌入方式因图像格式而异,不同格式的图像文件(如JPG, TIF, DNS
等)有不同的嵌入方式。
2. 如何查看元数据
在Windows上,最常见的图片元数据就是图片文件的 【属性】——>【详细信息】 这一页,如下图所示:
实际上,图片的元数据还有很多,我们可以通过Photoshop
的 【文件】——>【文件简介】 来查看相关信息,如下图所示,包含很多内容:
在【高级】和【原始数据】(原始数据的json
串)中包含的内容:
2、图像Exif信息
2.1 简介
Exif(Exchangeable image file format,官方简称Exif)
,是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
EXIF
可以附加于JPEG、TIFF、RIFF
等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。
Exif
最初由日本电子工业发展协会在1996年制定,版本为1.0.1988年升级到2.1,增加了对音频文件的支持。2002年3月,发表了2.2版。
Windows7操作系统具备对Exif
的原生支持,通过鼠标右键点击图片-属性-详细信息标签下即可查看Exif信息。
Exif
信息是可以被任意编辑的,因此只有参考的功能。
Exif
所记录的元数据信息非常丰富,主要包含了以下几类信息:
- 拍摄信息
- 拍摄器材(机身、镜头、闪光灯等)
- 拍摄参数(快门速度、光圈F值、ISO速度、焦距、测光模式等)
- 图像处理参数(锐化、对比度、饱和度、白平衡等)
- 图像描述及版权信息
- GPS定位数据
- 缩略图
本文以
JPG
文件格式为例,来分析Exif
的构成。
2.1 JPG文件结构
此部分参考博文 照片元数据–Exif_严开明_新浪博客 内容。
JPG
文件是由“段”(segment
)组成的,每个段都是由FFxx
开头,其中xx
是段的标识,说明是什么段,如FFD8
标志文件的开始,称为开始段(SOI
),FFD9
标志文件结束,称为结束段(EOI
)。其他如DQT, DHT
等都是与JPG压缩有关的数据段。
但其中FFE0-FFEF
是保留为应用段(APP段
),即这些段中的信息是为某些应用程序所用,不是JPG解码所必需的。
Exif
就是用FFE1
(APP1
)作为其段标镶嵌在JPG
文件开始段SOI
的后面,因此Exif
的数据也就称为 APP1段,其结构如下图所示:
在APP1
段标下面是段的长度和以字符串“Exif”
的标记。Exif
标记下面都是以TIFF
格式存放的数据,也就是Exif
数据采用TIFF
格式。
2.2 Exif与TIFF的关系
TIFF
是一种图像文件格式,包含图像数据和元数据。由于其简单灵活,所以使用很广。其结构如下图所示:
TIFF
文件由三部分构成:文件头(TIFF Header
),文件目录IFD(Image File Directory
)和目录项(Directory Entry
)。
文件头的格式与长度是固定的,主要是指出第一个文件目录(IFD0
)的位置。文件目录IFD
则指出该图像有多少个目录项(Directory Entry
),和下一个IFD
的位置。
每个目录项有12字节,如上图中IFD0
有8个目录项。一般一个IFD表示一个图像,如果TIFF文件中有多个图像,则有多个IFD
(IFD0, IFD1,…
)。各个IFD
由指针连接。
大多数的目录项是存放图像的元数据,目录项中的标签编码(Tag
)代表元数据的名称,另外还有类型及数据等如上图所示。
TIFF
只定义了图像的基本元数据,对于某些图像中的特有元数据(如照片中的光圈快门等)可以用Private IFD
自行定义其专门的元数据。也就是Private IFD
可以看成是IFD
的扩充,用IFD0
中某一标签(Tag
)作为指针,指向另一个子IFD
,然后在子IFD
中定义自己的元数据。
Exif
就是由IFD0
中Tag=0x8769
的目录项(称为exifIFD
)指向一个Exif subIFD
,在该子IFD
中就是与照片有关的各种元数据,如光圈,快门等。因此Exif
使用的是TIFF
格式,而Exif
本身则是TIFF IFD0
的一个子集。
与Exif
类似的还有GPS
数据(具有GPS功能相机记录的拍摄位置),是由IFD0
中Tag=0x8825
的目录项指向GPS subIFD
。
此外Exif
还包含缩略图标,所以还有第二个IFD(IFD1
)用于表示缩略图。
Exif
总的结构如下图所示:
- 需要指出的是
Exif
的IFD0
中没有图像数据。Exif
中的Makernote
是制造商自己设置的数据,没有统一格式,很多也是不公开的,所以Makernote
也是作为Exif
的一个子IFD
,由制造商自己定义。
2.3 Exif元数据
Exif
元数据根据不同的内容分布在五个不同的IFD
中:
IFD0
中的数据是由TIFF定义的图像基本数据,其中有些与照片无关,所以Exif
只实现其中一小部分。这部分数据在Photoshop
中称为TIFF
元数据。Exif subIFD
中的数据是由Exif
定义的元数据,都是和相机照片有关的数据,是Exif
的主要数据,其中有一些与IFD0
中的重复GPS subIFD
中的数据是记录照片的拍摄位置,对于没有GPS功能的相机,这里的数据都是空的。IFD1
中的数据是缩略图的图像及该图像的元数据Maskernote IFD
是制造商自己定义的元数据,没有标准,有些商家的数据也不对外公开。
2.4 总结
3、Exif工具
该部分介绍如何使用相应的工具去查看/修改图片的Exif
信息。
3.1 Pillow库
使用
Pillow
库中的Image
查看图像的exif
。
- 通过
Image.info['exif']
可以直接获取raw_exif
信息,类型是bytes
- 通过
Image._getexif()
方法,获取图像exif
信息,类型是字典 - 可以通过
ExifTags.TAGS
查看所有的标签号及对应的标签名
类型是字典,可以根据标签号获取对应的名称
使用
Image._getexif()[306]
获取得到的时间信息类型是str
。
from PIL import Image, ExifTags
img = Image.open('01.jpg')
# 方法1
#Image.info中是图像所包含的信息
>>> img.info.keys()
dict_keys(['jfif', 'jfif_version', 'dpi', 'jfif_unit', 'jfif_density', 'exif', 'parsed_exif'])
>>> type(img.info['exif'])
<class 'bytes'>
# 方法2
>>> exifdata = img._getexif()
>>> print(type(exifdata))
>>> print(exifdata.keys())
<class 'dict'>
dict_keys([256, 257, 258, 36864, 37121, 37377, 36867, 36868, 37378, 37379, 37380, 41995, 37383, 37384, 270, 271, 272, 37385, 274, 531, 40962, 37520, 37521, 37522, 40963, 41495, 282, 283, 40965, 41728, 33434, 33437, 41729, 59933, 34850, 41985, 34855, 296, 41986, 40960, 41987, 305, 306, 41988, 41989, 41990, 37386, 41991, 40961, 41992, 41993, 41994, 41996, 34665, 37500])
# 查看标签号和标签名
>>> ExifTags.TAGS
{11: 'ProcessingSoftware', 254: 'NewSubfileType', 255: 'SubfileType', 256: 'ImageWidth', 257: 'ImageLength', 258: 'BitsPerSample', 259: 'Compression', 262: 'PhotometricInterpretation', 263: 'Thresholding', 264: 'CellWidth', 265: 'CellLength', 266: 'FillOrder', 269: 'DocumentName', 270: 'ImageDescription', 271: 'Make', 272: 'Model', 273: 'StripOffsets', 274: 'Orientation', 277: 'SamplesPerPixel', 278: 'RowsPerStrip', 279: 'StripByteCounts', 280: 'MinSampleValue', 281: 'MaxSampleValue', 282: 'XResolution', 283: 'YResolution', 284: 'PlanarConfiguration', 285: 'PageName', 288: 'FreeOffsets', 289: 'FreeByteCounts', 290: 'GrayResponseUnit', 291: 'GrayResponseCurve', 292: 'T4Options', 293: 'T6Options', 296: 'ResolutionUnit', 297: 'PageNumber', 301: 'TransferFunction', 305: 'Software', 306: 'DateTime'
......
# TAGS中标签名的数量
>>> len(ExifTags.TAGS)
254
# 查询标签名
>>>ExifTags.TAGS.get(306)
'DateTime'
>>>ExifTags.TAGS[306]
'DateTime'
3.2 exiv2
Exiv2
:一个基于C++、跨平台的程序,可以读写图片元数据(EXIF, IPTC, XMP
)。它提供了可执行文件供命令行使用,也提供了C++
的API
供编程。
2009年,有team开发基于Exiv2
的Python
库——pyexiv2
。
具体见 pyexiv2官网
基于
python2.7
,不支持python3.x
该库提供了类似python dict
形式的修改exif
信息的方法。在处理GPS信息的时候,需要将相应的坐标数据转换成有理数形式,pyexiv2
提供了相应的方法。
但2011年之后停止更新了。
当前使用pip install pyexiv2
安装的pyexiv2
库是后来有人做了一个简单的基于Exiv2
的Python
库——还是叫pyexiv2
。
【github】地址: LeoHsiao1/pyexiv2
安装:
pip install pyexiv2
测试:
导入库时出现如下错误:
分析:
使用命令strings /lib/x86_64-linux-gnu/libm.so.6 | grep GLIBC_
查看/lib/x86_64-linux-gnu/libm.so.6
这个文件支持的glibc
的版本。
发现当前并不支持 GLIBC_2.27
,当前的系统是ubuntu server16.04
glibc
是gnu
发布的libc库
,即c运行库。glibc
是linux
系统中最底层的api
,几乎其他任何运行库都会依赖于glibc
。glibc
除了封装linux
操作系统提供的的系统服务外,它本身也提供了许多其他一些必要功能服务的实现。
解决方法:
将系统升级到ubuntu server18.04
。
考虑到多人使用服务器,并没有升级系统,这个不行可以使用其他的。
3.3 exifread库
安装:
pip install exifread
主要通过tags = exifread.process_file(fd)
函数读取图片的Exif
信息。
tags
的类型是字典。
注意标签名的写法。
Exif
信息中则包含拍照时间信息,通过读取 EXIF DateTimeOriginal
的值则可获取其信息,并进行解析和处理则可获得拍照时间.
通过
exifread
库process_file()
函数得到的图片时间信息的类型是<class 'exifread.classes.IfdTag'>
,在处理的时候,可以使用str()
将其转为字符串类型。
import exifread
fd = open('01.jpg', 'rb')
tags = exifread.process_file(fd)
>>>tags.keys()
dict_keys(['Image ImageWidth', 'Image ImageLength', 'Image BitsPerSample', 'Image ImageDescription', 'Image Make', 'Image Model', 'Image Orientation', 'Image XResolution', 'Image YResolution', 'Image ResolutionUnit', 'Image Software', 'Image DateTime', 'Image YCbCrPositioning', 'Image ExifOffset', 'Image DeviceSettingDescription', 'Thumbnail ImageWidth', 'Thumbnail ImageLength', 'Thumbnail Compression', 'Thumbnail Orientation', 'Thumbnail XResolution', 'Thumbnail YResolution', 'Thumbnail ResolutionUnit', 'Thumbnail JPEGInterchangeFormat', 'Thumbnail JPEGInterchangeFormatLength', 'EXIF DocumentName', 'EXIF ExposureTime', 'EXIF FNumber', 'EXIF ExposureProgram', 'EXIF ISOSpeedRatings', 'EXIF ExifVersion', 'EXIF DateTimeOriginal', 'EXIF DateTimeDigitized', 'EXIF ComponentsConfiguration', 'EXIF ShutterSpeedValue', 'EXIF ApertureValue', 'EXIF BrightnessValue', 'EXIF ExposureBiasValue', 'EXIF MeteringMode', 'EXIF LightSource', 'EXIF Flash', 'EXIF FocalLength', 'EXIF MakerNote', 'EXIF SubSecTime', 'EXIF SubSecTimeOriginal', 'EXIF SubSecTimeDigitized', 'EXIF FlashPixVersion', 'EXIF ColorSpace', 'EXIF ExifImageWidth', 'EXIF ExifImageLength', 'Interoperability InteroperabilityIndex', 'Interoperability InteroperabilityVersion', 'EXIF InteroperabilityOffset', 'EXIF SensingMethod', 'EXIF FileSource', 'EXIF SceneType', 'EXIF CustomRendered', 'EXIF ExposureMode', 'EXIF WhiteBalance', 'EXIF DigitalZoomRatio', 'EXIF FocalLengthIn35mmFilm', 'EXIF SceneCaptureType', 'EXIF GainControl', 'EXIF Contrast', 'EXIF Saturation', 'EXIF Sharpness', 'EXIF SubjectDistanceRange', 'EXIF OffsetSchema', 'JPEGThumbnail'])
>>> str(tags['EXIF DateTimeOriginal'])
'2017:03:24 08:17:45'
>>> tags
{'Image ImageWidth': (0x0100) Short=2448 @ 18,
'Image ImageLength': (0x0101) Short=3264 @ 30,
'Image BitsPerSample': (0x0102) Short=[8, 8, 8] @ 194,
'Image ImageDescription': (0x010E) ASCII=cof @ 54,
'Image Make': (0x010F) ASCII=HUAWEI @ 200,
'Image Model': (0x0110) ASCII=LON-AL00 @ 208,
'Image Orientation': (0x0112) Short=0 @ 90,
'Image XResolution': (0x011A) Ratio=72 @ 218,
'Image YResolution': (0x011B) Ratio=72 @ 226,
......
}
3.4 piexif库
安装
pip install piexif
手册:
About Piexif — Piexif 1.1.x documentation
Piexif
不依赖任何第三个库。- 在
Python 2.7、3.3、3.4、3.5、3.6,pypy
和pypy3
上均可使用。
主要功能:
load(filename)
-以dict的形式获取exif数据。dump(exif_dict)
-以字节为单位获取exif
以使用JPEG保存。insert(exif_bytes,filename)
-将exif
插入JPEG。remove(filename)
-从JPEG
移除exif
。- 移植(文件名,文件名) -将
exif
从JPEG
移植到JPEG
。
使用:
- 直接使用
load
函数加载文件名,获取Exif
信息,返回结果类型是字典。 - 使用
load
函数加载通过pillow
的Image.open()
加载的图像的info['exif']
信息,即``
通过
pyexif
库获取的Exif
信息,得到的时间类型是<class 'bytes'>
,使用bytes.decode('utf-8')
将其转换为字符串类型str
。
import piexif
# method1
exifdata = piexif.load('01.jpg')
>>> type(exifdata)
dict
>>> exifdata.keys()
dict_keys(['0th', 'Exif', 'GPS', 'Interop', '1st', 'thumbnail'])
>>> exifdata['0th']
{256: 2448,
257: 3264,
258: (8, 8, 8),
270: b'cof',
271: b'HUAWEI',
272: b'LON-AL00',
274: 0,
282: (72, 1),
283: (72, 1),
296: 2,
305: b'LON-AL00C00B175',
306: b'2017:03:24 08:17:45',
531: 1,
34665: 270}
# method2
img = Image.open('01.jpg')
>>> img.info.keys()
dict_keys(['jfif', 'jfif_version', 'dpi', 'jfif_unit', 'jfif_density', 'exif'])
>>> exif_dict = piexif.load(img.info['exif'])
>>> print(exif_dict.keys())
dict_keys(['0th', 'Exif', 'GPS', 'Interop', '1st', 'thumbnail'])
>>> exif_dict['Exif']
{33434: (20000000, 1000000000),
33437: (220, 100),
34850: 2,
34855: 100,
36864: b'0210',
36867: b'2017:03:24 08:17:45',
36868: b'2017:03:24 08:17:45',
37121: b'\x01\x02\x03\x00',
37377: (298973, 10000),
....
}
使用示例可参考如下博文:
python修改图片exif信息 | 清平调
4、Exif记录的信息(标签)
4.1 IFD0 (主图像)使用的标签
IFD0 (主图像)使用的标签 | |||||||||||||||||||||||||||||||
标签号 | 标签名 | 格式 | 组件数 | 描述 | |||||||||||||||||||||||||||
0x010e | ImageDescription | ascii string | 用来描述图像. 双字节的字符码不能使用, 如 中文/韩文/日文. | ||||||||||||||||||||||||||||
0x010f | Make | ascii string | 表示数字相机的制造商. 在 Exif 标准中, 这个标签是可选的, 但是在DCF中它是必需的. | ||||||||||||||||||||||||||||
0x0110 | Model | ascii string | 表示数字相机的模块代码(型号). 在 Exif 标准中, 这个标签是可选的, 但在DCF中它也是必需的. | ||||||||||||||||||||||||||||
0x0112 | Orientation | unsigned short | 1 |
| |||||||||||||||||||||||||||
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 | 显示固件的版本号(数字相机的内部控制软件).(固件Firmware版本或编辑软件) | ||||||||||||||||||||||||||||
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的偏移量 |
4.2 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/(24)=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) 几何模式.
|
4.3 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 |
4.4 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. |
4.5 Misc Tags
标签号 | 标签名 | 格式 | 组件数 | 描述 |
---|---|---|---|---|
0x00fe | NewSubfileType | unsigned long | 1 | |
0x00ff | SubfileType | unsigned short | 1 | |
0x012d | TransferFunction | unsigned short | 3 | |
0x013b | Artist | ascii string | ||
0x013d | Predictor | unsigned short | 1 | |
0x0142 | TileWidth | unsigned short | 1 | |
0x0143 | TileLength | unsigned short | 1 | |
0x0144 | TileOffsets | unsigned long | ||
0x0145 | TileByteCounts | unsigned short | ||
0x014a | SubIFDs | unsigned long | ||
0x015b | JPEGTables | undefined | ||
0x828d | CFARepeatPatternDim | unsigned short | 2 | |
0x828e | CFAPattern | unsigned byte | ||
0x828f | BatteryLevel | unsigned rational | 1 | |
0x83bb | IPTC/NAA | unsigned long | ||
0x8773 | InterColorProfile | undefined | ||
0x8824 | SpectralSensitivity | ascii string | ||
0x8825 | GPSInfo | unsigned long | 1 | |
0x8828 | OECF | undefined | ||
0x8829 | Interlace | unsigned short | 1 | |
0x882a | TimeZoneOffset | signed short | 1 | |
0x882b | SelfTimerMode | unsigned short | 1 | |
0x920b | FlashEnergy | unsigned rational | 1 | |
0x920c | SpatialFrequencyResponse | undefined | ||
0x920d | Noise | undefined | ||
0x9211 | ImageNumber | unsigned long | 1 | |
0x9212 | SecurityClassification | ascii string | 1 | |
0x9213 | ImageHistory | ascii string | ||
0x9214 | SubjectLocation | unsigned short | 4 | |
0x9215 | ExposureIndex | unsigned rational | 1 | |
0x9216 | TIFF/EPStandardID | unsigned byte | 4 | |
0xa20b | FlashEnergy | unsigned rational | 1 | |
0xa20c | SpatialFrequencyResponse | unsigned short | 1 | |
0xa214 | SubjectLocation | unsigned short | 1 |
5、参考文献
[1] 照片的元数据(1)–Exif_严开明_新浪博客
[2] python修改图片exif信息 | 清平调
[3] python3.x - Python 3 如何修改照片的 exif 信息 - SegmentFault 思否
[4] 使用Python获取照片Exif信息 – 标点符
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)