Python读写图片EXIF和IFD0信息

Python如何读写图片的详细信息?

如下图所示,我一开始以为这些属性都是在图片的EXIF信息当中的,但用piexif或exifread读取时发现只能读取到标题和作者

img

利用工具发现

img

请问使用Python该如何读取和写入图片的上述信息呢?
有现成工具最好,如果没有的话相关的文档或者介绍也是可以的,谢谢了

补充一下,我上面图里标注的几个读取不了的属性,并不是说用piexif或exifread或PIL里的getexif()得不到值,而是得到的值是一串数字组成的列表/元组

img

参考GPT和自己的思路:要读取和写入图片的详细信息,需要使用Python的图像处理库。常用的图像处理库有Pillow和OpenCV等。以下是使用Pillow库读取和写入图片的EXIF和IFD0信息的示例代码:

from PIL import Image
from PIL.ExifTags import TAGS

# 读取图片的EXIF信息
def get_exif_data(image_path):
    with Image.open(image_path) as img:
        exif = img.getexif()
        exif_data = {}
        for tag_id, value in exif.items():
            tag = TAGS.get(tag_id, tag_id)
            exif_data[tag] = value
        return exif_data

# 写入图片的EXIF信息
def write_exif_data(image_path, exif_data):
    with Image.open(image_path) as img:
        exif_bytes = img.info['exif'] if 'exif' in img.info else None
        img.save(image_path, exif=exif_data, exif_bytes=exif_bytes)

# 读取图片的IFD0信息
def get_ifd0_data(image_path):
    with Image.open(image_path) as img:
        ifd0_data = img.info.get('ifd0', {})
        return ifd0_data

# 写入图片的IFD0信息
def write_ifd0_data(image_path, ifd0_data):
    with Image.open(image_path) as img:
        img.info['ifd0'] = ifd0_data
        img.save(image_path)

这段代码可以读取和写入图片的EXIF和IFD0信息。例如,要读取图片的EXIF信息,可以使用以下代码:

exif_data = get_exif_data('image.jpg')
print(exif_data)

要写入图片的EXIF信息,可以使用以下代码:

exif_data = {
    TAGS['Make']: 'Canon',
    TAGS['Model']: 'Canon EOS 5D Mark IV',
    TAGS['Software']: 'Adobe Photoshop Lightroom Classic 10.3 (Windows)',
    # 其他属性
}
write_exif_data('image.jpg', exif_data)

要读取图片的IFD0信息,可以使用以下代码:

ifd0_data = get_ifd0_data('image.jpg')
print(ifd0_data)

要写入图片的IFD0信息,可以使用以下代码:

ifd0_data = {
    'ImageDescription': '这是一张测试图片',
    'Artist': '测试作者',
    # 其他属性
}
write_ifd0_data('image.jpg', ifd0_data)

注意,这些信息不一定都存在于图片的EXIF信息当中,有些信息可能存在于IFD0中。在使用时需要根据具体情况选择读取或写入哪些信息。

“Devil组”引证GPT后的撰写:

  • 读取和写入图片的详细信息需要使用Pillow库,它是Python中最常用的图像处理库之一。

下面是一个示例代码,演示如何读取和写入图像的各种属性,包括标题、作者、日期、描述等等。

from PIL import Image
from PIL.ExifTags import TAGS

# 打开图像文件
img = Image.open("example.jpg")

# 读取图像的元数据
metadata = img.getexif()

# 将元数据解析为可读的格式
metadata_dict = {}
for tag_id, value in metadata.items():
    tag = TAGS.get(tag_id, tag_id)
    metadata_dict[tag] = value

# 输出元数据
print(metadata_dict)

# 修改元数据
metadata_dict["ImageDescription"] = "这是一个美丽的风景照片"
metadata_dict["DateTime"] = "2022:03:08 12:00:00"

# 将元数据转换回原始格式
new_metadata = {}
for tag, value in metadata_dict.items():
    tag_id = TAGS.get(tag, tag)
    new_metadata[tag_id] = value

# 保存修改后的图像文件
img.save("example_modified.jpg", exif=new_metadata)


用Pillow库的Image.open()函数打开一张图片,然后使用img.getexif()函数读取该图片的元数据。元数据以一个字典的形式返回,其中键是元数据标签的编号,值是该标签的值。

  • 由于元数据标签的编号不太容易阅读,因此用Pillow库中的TAGS字典将其转换为可读的标签名称。然后将元数据字典转换为更易读的metadata_dict。
  • 在修改元数据之后,用new_metadata字典将其转换回原始格式,并使用img.save()函数将修改后的图像保存到一个新的文件中。在img.save()函数中,将修改后的元数据作为exif参数传递。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在Python中可以使用Pillow或者OpenCV等库来读取和写入图片的详细信息。其中,Pillow库应用更广泛,下面以Pillow库为例进行说明。

读取图片的详细信息:

from PIL import Image
from PIL.ExifTags import TAGS

# 打开图片
im = Image.open("test.jpg")

# 获取所有的Exif信息
exif = im.getexif()

# 遍历Exif信息,将其以可读的方式输出
for tag_id in exif:
    tag = TAGS.get(tag_id, tag_id)
    data = exif.get(tag_id)
    if isinstance(data, bytes):
        data = data.decode()
    print(f"{tag:25}: {data}")

输出结果类似于:

Make                     : Canon
Model                    : Canon EOS 60D
Orientation              : 1
XResolution              : 72
YResolution              : 72
ResolutionUnit           : 2
DateTime                 : 2019:11:23 21:08:08
YCbCrPositioning         : 1
ExifOffset               : 234
GPSInfo                  : {GPSInfo}

写入图片的详细信息:

from PIL import Image
from PIL.ExifTags import TAGS

# 打开图片
im = Image.open("test.jpg")

# 获取所有的Exif信息
exif = im.getexif()

# 修改Exif信息中的标题和作者
exif[TAGS["ImageDescription"]] = "这是一张测试照片"
exif[TAGS["Artist"]] = "TestUser"

# 将修改后的Exif信息写回图片
im.save("test.jpg", exif=exif)

需要注意的是,有些图片可能没有Exif信息,读取时需要进行异常处理;在写入图片时,需要使用im.save()方法,并将exif参数设置为修改后的Exif信息。
如果我的回答解决了您的问题,请采纳!

纯恶心人,全是些网上一搜就能搜到的AI回答,getexif我不知道吗,chardet我不知道吗,一点题目不看,AI跑一遍就把答案复制粘贴过来