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

1843

被折叠的 条评论
为什么被折叠?



