Python - 如何向图像添加任意的EXIF数据(UserComment字段)?

4
我需要在JPEG图像中添加任意数据。具体而言,我需要存储两个整数。从阅读有关EXIF数据的内容中,我认为不可能创建自定义字段,而必须使用EXIF标准字段。
然而,这篇文章Custom Exif Tags提到了一个UserComment字段,我认为可以将字符串写入其中。如果这是唯一的选项,那没问题,因为我可以将两个整数存储在逗号分隔的字符串中,例如“2,5”来存储整数2和5,因此如果我只有一个字符串的存储空间,仍然足够。
我从Google图像搜索中下载了一些随机图像,发现它们似乎没有EXIF数据,也许这是谷歌故意剥离的?我还用手机拍摄了一些图像,并发现它们有大量的EXIF数据(图像大小、GPS位置等)。
经过一些谷歌搜索,我找到了如何读取/转储EXIF数据的示例:
from PIL import Image

image = Image.open('image.jpg')
exifData = image._getexif()
print('exifData = ' + str(exifData))

如果我在没有EXIF数据的图像上运行此代码,则会出现以下情况:
exifData = None

如果我对带有EXIF数据的图像运行此代码,我会得到一个字典,其中包含预期的EXIF字段。
现在我的问题是,如何添加EXIF数据?使用上面链接的文章中提到的UserComment 37510字段,以及此处https://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/usercomment.html,并使用piexif,这是目前为止我最好的尝试:
from PIL import Image
import piexif

image = Image.open('image.jpg')

exifData = image._getexif()

if exifData is None:
    exifData = {}
# end if

exifData[37510] = 'my message'

exifDataBytes = piexif.dump(exifData)

image.save('image_mod.jpg', format='jpeg', exif=exifDataBytes)

如果我在 image_mod.jpg 上运行上面的第一个代码,我会得到:
exifData = {}

很明显,37510消息没有正确编写。我无论使用具有EXIF数据或一开始没有EXIF数据的图像,都会得到相同的空字典结果。在有人标记此为重复之前,我还尝试了这篇文章如何在存储在内存缓冲区中的JPEG中插入EXIF /其他元数据?中最高评分答案中提到的内容,并在尝试读取EXIF数据(空字典)时得到了相同的结果。我做错了什么?我该如何正确地使用37510或任何其他方法向图像添加自定义EXIF数据?
2个回答

5

处理 传递给 piexif.dump 的数据时,您漏掉了一步:

exif_ifd = {piexif.ExifIFD.UserComment: 'my message'.encode()}

exif_dict = {"0th": {}, "Exif": exif_ifd, "1st": {},
         "thumbnail": None, "GPS": {}}

exif_dat = piexif.dump(exif_dict)
img.save('image_mod.jpg',  exif=exif_dat)

在此之后,您应该能够将其读回。有关处理自定义元数据的信息,请参见this answer

2

Rasterio标签是向图像添加任何类型的元数据最简单的方法。易于操作和实用。例如:

import rasterio

old_file=rasterio.open('old_image.tif')
profile=old_file.profile
data=old_file.read()


with rasterio.open('new_image.tif','w',**profile) as dst:
        dst.update_tags(a='1', b='2')
        dst.write(data)
        dst.close() 

#现在可以像下面这样访问标签:

im=rasterio.open('new_image.tif')
print(im.tags())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接