文章目录
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, 4198