Python用pyexiv2读写图片元数据(EXIF、IPTC、XMP)

  • Post author:
  • Post category:python




图片元数据是什么?

图片元数据(metadata)是嵌入到图片文件中的一些标签。比较像文件属性,但是种类繁多。常见的几种标准有:

  • EXIF:通常被数码相机在拍摄照片时自动添加,比如相机型号、镜头、曝光、图片尺寸等信息。
  • IPTC:比如图片标题、关键字、说明、作者、版权等信息。
  • XMP:由Adobe公司制定标准,以XML格式保存。用PhotoShop等Adobe公司的软件制作的图片通常会携带这种信息。

在Windows上,最常见的图片元数据就是图片文件的“属性”->“详细信息”这一页:

在这里插入图片描述

实际上,图片元数据远不止这些,下图是Adobe Bridge中可编辑的元数据列表:

在这里插入图片描述

这么多种元数据,都保存在图片的原文件中,随图片一起移动:

在这里插入图片描述



如何编辑?

由于图片元数据种类繁多,再加上图片本身也有很多种格式,所以很难找到可以统一编辑各种元数据的软件。

笔者目前选择的解决方案是Exiv2:一个基于C++、跨平台的程序,可以读写图片元数据(EXIF、IPTC、XMP)。它提供了可执行文件供命令行使用,也提供了C++的API供编程调用。

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() 方法