文章目录

  • 简介
  • 图像元数据
  • 如何查看图像元数据
  • pyexiv2
  • pyexiv2读取图片的元数据的函数接口
  • 主要部分pyexiv2的EXIF元数据说明
  • 代码示例
  • 参考资料


简介

我们可以使用pyexiv2这个Python第三方工具在Windows系统中包读取图片文件的元数据Metadata。其中,经常会使用的图片元数据一般是有关图片格式的EXIF😄和版权的IPTC数据😄。此篇博客介绍了pyexiv2的安装和基本使用方法,并提供了Python代码示例。当然,pillow也可以查看图片的元数据,文中也直接给出了pillow查看图片元数据的代码示例。😆😆

PS:若图片数据已经被抹去了元数据信息,pyexiv2可能读不到任何数据!比如下面这一行COCO数据中的图片,就无法读取相关信息。建议拿一张自己拍摄的照片尝试一下。

图像元数据

图像元数据是指存储在数字图像文件中的附加信息,用于描述有关图像的各种属性和特征。这些元数据提供了关于图像的详细信息,方便组织、搜索和理解图像内容。通过使用工具如Pyexiv2,用户可以轻松访问和编辑这些元数据,以满足各种需求。常见的图像元数据包括:

  • EXIF(Exchangeable Image File Format)数据⭐️⭐️🚀🚀:这是最常见的图像元数据之一,包括了拍摄日期和时间、相机型号、曝光时间、光圈值、ISO感光度、焦距、闪光灯状态等与拍摄条件有关的信息。
  • IPTC(International Press Telecommunications Council)数据⭐️🚀:通常包含有关图像的描述性信息,如标题、作者、版权、关键字和特殊说明。
  • XMP(Extensible Metadata Platform)数据:提供了一种灵活的方法来存储和管理图像的元数据,包括自定义标签、扩展属性和附加信息。
  • GPS信息:如果启用了GPS功能,图像元数据可以包括拍摄地点的经纬度坐标,使用户能够准确地知道图像拍摄的地理位置。
  • 色彩空间信息:描述图像的色彩空间,如sRGB、Adobe RGB等。
  • 文件格式和压缩参数:指定图像的文件格式(如JPEG、PNG)和压缩设置。
  • 图像分辨率:图像的宽度和高度以及像素密度信息。
  • 修改历史:包含了有关图像编辑和修改的信息,如编辑软件、编辑日期和历史记录。

如何查看图像元数据

方法1:Windows查看图片属性,选择详细信息

python 读取网络图片文字_python


方法2:图片导入Photoshop,快捷键Ctrl+Alt+Shift+I

python 读取网络图片文字_python 读取网络图片文字_02

pyexiv2

Pyexiv2是一个用于处理图像元数据的Python第三方库。它允许您轻松读取和编辑照片和图像文件的元数据信息,如EXIF(Exchangeable Image File Format)数据、IPTC(International Press Telecommunications Council)标签和XMP(Extensible Metadata Platform)属性。这些元数据包含了有关图像的重要信息,如拍摄日期、相机型号、GPS坐标和作者信息等。

Pyexiv2提供了一个简单而强大的接口,允许你从图像文件中提取有关图像的信息,如拍摄日期、相机型号、光圈、快门速度等。你还可以使用它来添加、修改或删除图像的元数据,以满足特定需求。这在图像处理和管理中非常重要,因为它可以帮助你自动化和个性化图像的处理过程。

总之,Pyexiv2是一个用于Python的元数据处理库,提供了方便的工具,用于访问和编辑图像文件中的元数据信息,使图像处理和管理更加灵活和高效。无论你是处理照片、构建图像相关应用还是进行数字档案管理,Pyexiv2都是一个有用的工具。

pyexiv2读取图片的元数据的函数接口

  • read_exif
  • read_comment
  • read_icc
  • read_iptc
  • read_raw_xmp
  • read_thumbnail
  • read_xmp
with pyexiv2.Image(filename="000000000009.jpg") as img:
    exif = img.read_exif()
    comment = img.read_comment()
    icc = img.read_icc()
    iptc = img.read_iptc()
    raw_xmp = img.read_raw_xmp()
    thumbnail = img.read_thumbnail()
    xmp = img.read_xmp()

主要部分pyexiv2的EXIF元数据说明

这些都是调用read_exif可能返回的元数据字典的key。

元数据

说明

Exif.Image.ImageWidth

图片宽度

Exif.Image.Model

拍摄设备与型号

Exif.Image.Orientation

图片方向

Exif.Image.DateTime

拍摄日期

Exif.Image.YCbCrPositioning

色相定位

Exif.Photo.ExposureTime

曝光时间

Exif.Photo.FocalLength

焦距

Exif.Photo.LightSource

光源

Exif.Photo.BrightnessValue

亮度

Exif.Photo.ColorSpace

色彩空间

Exif.Image.XResolution

X方向分辨率

Exif.Image.YResolution

Y方向分辨率

相关参数还有很多,自出表格不再一一列举。感兴趣可自行查看!

代码示例

读取图片EXIT元数据,修改图片EXIT元数据,调用pillow查看图片元数据。

yifeiliu.jpg

python 读取网络图片文字_windows_03

import pyexiv2
from PIL import Image

def read_exif_metadata(img_path):
    """调用pyexiv2读取图片的EXIF元数据, 并返回一个数据字典"""
    with pyexiv2.Image(filename=img_path, encoding="utf-8") as pyexiv2_img:
        exif_metadata = pyexiv2_img.read_exif()

    return exif_metadata


def set_exif_metadata(img_path, metadata_dict: dict):
    """调用pyexiv2修改图片的EXIF元数据, 成功返回True, 失败返回False"""
    try:
        with pyexiv2.Image(filename=img_path, encoding="utf-8") as pyexiv2_img:
            pyexiv2_img.modify_exif(metadata_dict)

        return True
    except Exception as e:
        print(e)
        return False
    
def read_exif_metadata_PIL(img_path):
    """调用pillow读取图片的EXIF元数据, 并返回一个数据字典"""
    with Image.open(fp=img_path) as pillow_img:
        exif_metadata = pillow_img.getexif()

    return exif_metadata


def clear_exif_metadata(img_path):
    """调用pyexiv2清除图片的EXIF元数据, 成功返回True, 失败返回False"""
    try:
        with pyexiv2.Image(filename=img_path, encoding="utf-8") as pyexiv2_img:
            pyexiv2_img.clear_exif()

        return True
    except Exception as e:
        print(e)
        return False
    

if __name__ == "__main__":
    metadata = read_exif_metadata("yifeiliu.jpg")
    print(f"第1次读取EXIF元数据: {metadata}")
    metadata_dict = {
        "Exif.Image.Model": "Cannon R3",
        "Exif.Image.ImageWidth": 1202,
        "Exif.Image.ImageLength": 676
    }
    ret = set_exif_metadata("yifeiliu.jpg", metadata_dict)
    metadata = read_exif_metadata("yifeiliu.jpg")
    print(f"第2次读取EXIF元数据: {metadata}")
    metadata = read_exif_metadata_PIL("yifeiliu.jpg")
    print(f"第3次读取EXIF元数据(pillow) {metadata}")
    ret = clear_exif_metadata("yifeiliu.jpg")
    metadata = read_exif_metadata("yifeiliu.jpg")
    print(f"第3次读取EXIF元数据(清除数据后): {metadata}")

结果:

python 读取网络图片文字_python 读取网络图片文字_04

参考资料

  1. Github:pyexiv2
  2. pyexiv2中文教程
  3. Welcome to py3exiv2’s documentation!⭐️
  4. CSDN:Python用pyexiv2读写图片元数据(EXIF、IPTC、XMP)
  5. https://www.osgeo.cn/python-tutorial/imgs-exif.html