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

    • 图片元数据是什么?
    • 如何编辑?

图片元数据是什么?

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

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

在Windows上,最常见的图片元数据就是图片文件的“属性”->“详细信息”这一页:
Python用pyexiv2读写图片元数据(EXIF、IPTC、XMP)_第1张图片
实际上,图片元数据远不止这些,下图是Adobe Bridge中可编辑的元数据列表:
Python用pyexiv2读写图片元数据(EXIF、IPTC、XMP)_第2张图片
这么多种元数据,都保存在图片的原文件中,随图片一起移动:
Python用pyexiv2读写图片元数据(EXIF、IPTC、XMP)_第3张图片

如何编辑?

由于图片元数据种类繁多,再加上图片本身也有很多种格式,所以很难找到可以统一编辑各种元数据的软件。
笔者目前选择的解决方案是Exiv2:一个基于C++、跨平台的程序,可以读写图片元数据(EXIF、IPTC、XMP)。它提供了可执行文件供命令行使用,也提供了C++的API供编程调用。

  • Exiv2的网站:https://www.exiv2.org/index.html
  • Exiv2支持的元数据列表:https://www.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页面。

2020年2月发布了2.0版本,API有所变动,请看新教程

以下是部分用法示例:

  • 读取元数据:

    >>> 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()			# 操作完之后,记得关闭图片
    
  • 修改元数据:

    >>> # 准备一个字典,包含你想修改的标签
    >>> _dict = {"Xmp.xmp.CreateDate": "2019-06-23T19:45:17.834",   # 设置这个标签的值
    ...          "Xmp.xmp.Rating": ""}  # 显式地设置一个空字符串来删除该标签
    }
    >>> i.modify_xmp(_dict)				# 执行修改
    >>> xmp_dict = i.read_xmp()         # 重新读取元数据
    >>> xmp_dict["Xmp.xmp.CreateDate"]
    '2019-06-23T19:45:17.834'           # 这个标签已经被修改了
    >>> xmp_dict["Xmp.xmp.Rating"]
    KeyError: 'Xmp.xmp.Rating'          # 这个标签已经被删除了
    
    # 使用 i.modify_exif() 、i.modify_iptc() 的方法同理
    

你可能感兴趣的:(#,图片处理)