图片元数据是什么?
图片元数据(metadata)是嵌入到图片文件中的一些标签。比较像文件属性,但是种类繁多。常见的几种标准有:
- EXIF:通常被数码相机在拍摄照片时自动添加,比如相机型号、镜头、曝光、图片尺寸等信息。
- IPTC:比如图片标题、关键字、说明、作者、版权等信息。
- XMP:由Adobe公司制定标准,以XML格式保存。用PhotoShop等Adobe公司的软件制作的图片通常会携带这种信息。
在Windows上,最常见的图片元数据就是图片文件的“属性”->“详细信息”这一页:
实际上,图片元数据远不止这些,下图是Adobe Bridge中可编辑的元数据列表:
这么多种元数据,都保存在图片的原文件中,随图片一起移动:
如何编辑?
由于图片元数据种类繁多,再加上图片本身也有很多种格式,所以很难找到可以统一编辑各种元数据的软件。
笔者目前选择的解决方案是Exiv2:一个基于C++、跨平台的程序,可以读写图片元数据(EXIF、IPTC、XMP)。它提供了可执行文件供命令行使用,也提供了C++的API供编程调用。
-
Exiv2的网站:
https://exiv2.org/index.html
-
Exiv2支持的元数据列表:
https://exiv2.org/metadata.html
-
Exiv2支持的图片格式:
https://dev.exiv2.org/projects/exiv2/wiki/Supported_image_formats
2009年,有team开始开发基于Exiv2的Python库——pyexiv2:
https://launchpad.net/pyexiv2
但是2011年之后就停止更新了。
笔者没找到如今可用的版本,于是做了一个简单的基于Exiv2的Python库——还是叫pyexiv2,使用
pip install pyexiv2
即可安装。
- 它只能在python3 (64位)上运行,兼容Linux、MacOS、Windows。
- 它可以直接读取各种类型的元数据、修改大部分类型的元数据,但有少量特殊的元数据不能修改。
-
详细说明请看
github页面
。
中文教程
以下是部分用法示例:
-
读取元数据:
>>> from pyexiv2 import Image >>> img = Image(r'.\pyexiv2\tests\1.jpg') >>> img.read_exif() # 读取 EXIF 类型的元数据,这会返回一个字典 {'Exif.Image.DateTime': '2019:06:23 19:45:17', 'Exif.Image.Artist': 'TEST', 'Exif.Image.Rating': '4', ...} >>> img.read_iptc() {'Iptc.Envelope.CharacterSet': '\x1b%G', 'Iptc.Application2.ObjectName': 'TEST', 'Iptc.Application2.Keywords': 'TEST', ...} >>> img.read_xmp() {'Xmp.dc.format': 'image/jpeg', 'Xmp.dc.rights': 'lang="x-default" TEST', 'Xmp.dc.subject': 'TEST', ...} >>> img.close() # 操作完之后,记得关闭图片,释放内存
-
修改元数据:
>>> # 准备一个字典,包含你想修改的标签 >>> dic1 = {"Xmp.xmp.CreateDate": "2019-06-23T19:45:17.834", # 指定这个标签的值 ... "Xmp.xmp.Rating": None} # 赋值 None 会删除该标签 >>> img.modify_xmp(dic1) # 执行修改 >>> dic2 = img.read_xmp() # 重新读取元数据 >>> dic2["Xmp.xmp.CreateDate"] '2019-06-23T19:45:17.834' # 这个标签已经被修改了 >>> dic2["Xmp.xmp.Rating"] KeyError: 'Xmp.xmp.Rating' # 这个标签已经被删除了 # 同理还可调用 img.modify_exif() 、img.modify_iptc() 方法