图像元数据(Metadata) ——Exif信息分析

1、元数据

元数据(Matedata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息。用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。

元数据是关于数据的组织、数据域及其关系的信息,简言之,元数据就是关于数据的数据。(来自百度百科)

1. 图片元数据

图片元数据(Metadata) 是嵌入到图片文件中的一些标签。比较像文件属性,但是种类繁多。对于数码图像,目前常见的研数据有EXIF, IPTC和XMP三种:

  • EXIF:通常被数码相机在拍摄照片时自动添加,比如相机型号、镜头、曝光、图片尺寸等信息
  • IPTF:比如图片标题、关键字、说明、作者、版权等信息。主要是由人工在后期通过软件写入的数据。
  • XMPXMP实际上是一种元数据存储和管理的标准,可以将Exif,IPTC或其他的数据都按XMP统一的格式存放在图像文件中。

元数据的嵌入方式因图像格式而异,不同格式的图像文件(如JPG, TIF, DNS等)有不同的嵌入方式。

2. 如何查看元数据

在Windows上,最常见的图片元数据就是图片文件的 【属性】——>【详细信息】 这一页,如下图所示:
图像属性详细信息
实际上,图片的元数据还有很多,我们可以通过Photoshop【文件】——>【文件简介】 来查看相关信息,如下图所示,包含很多内容:
PS文件简介
在【高级】和【原始数据】(原始数据的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是一种图像文件格式,包含图像数据和元数据。由于其简单灵活,所以使用很广。其结构如下图所示:
Exif与TIFF
TIFF文件由三部分构成:文件头TIFF Header),文件目录IFDImage 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就是由IFD0Tag=0x8769 的目录项(称为exifIFD)指向一个Exif subIFD,在该子IFD中就是与照片有关的各种元数据,如光圈,快门等。因此Exif使用的是TIFF格式,而Exif本身则是TIFF IFD0的一个子集。
Exif类似的还有GPS数据(具有GPS功能相机记录的拍摄位置),是由IFD0Tag=0x8825的目录项指向GPS subIFD

此外Exif还包含缩略图标,所以还有第二个IFD(IFD1)用于表示缩略图。

Exif总的结构如下图所示:
在这里插入图片描述

  • 需要指出的是ExifIFD0中没有图像数据。
  • 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

  1. 通过Image.info['exif']可以直接获取raw_exif信息,类型是bytes
  2. 通过Image._getexif()方法,获取图像exif信息,类型是字典
  3. 可以通过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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值