Python - 将任意 EXIF 数据添加到图像(UserComment 字段)?

cda*_*hms 4 python exif

我需要向 JPEG 图像添加任意数据。具体来说,我需要存储两个整数。通过阅读有关 EXIF 数据的内容,我的印象是不可能创建自己的自定义字段,而是必须使用 EXIF 标准字段。

然而,这篇文章“自定义 Exif 标签”UserComment提到了一个我收集的可以写入字符串的字段。如果这是唯一的选择,那很好,因为我可以在逗号分隔的字符串中存储两个整数,例如 '2,5' 来存储整数 2 和 5,所以如果我只有一个存储字符串可以使用,它仍然足够。

我从 Google 图片搜索中随机下载了一些图片,发现它们似乎没有 EXIF 数据,也许是 Google 故意删除的?我还用手机拍了几张照片,发现正如预期的那样,它们有大量的 EXIF 数据(图像大小、GPS 位置等)。

经过一番 Google 搜索后,我发现了这个关于如何读取/转储 EXIF 数据的示例:

from PIL import Image

image = Image.open('image.jpg')
exifData = image._getexif()
print('exifData = ' + str(exifData))
Run Code Online (Sandbox Code Playgroud)

这非常有效,如果我在没有 EXIF 数据的图像上运行它,我会得到:

exifData = None
Run Code Online (Sandbox Code Playgroud)

如果我在带有 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)
Run Code Online (Sandbox Code Playgroud)

如果我然后运行上面的第一个代码,image_mod.jpg我会得到:

exifData = {}
Run Code Online (Sandbox Code Playgroud)

很明显 37510 消息没有正确写入。无论我使用的是包含 EXIF 数据的图像还是不包含 EXIF 数据的图像,我都会得到相同的空字典结果。

在有人将其标记为重复之前,我还尝试了这篇文章如何将 EXIF/其他元数据插入存储在内存缓冲区中的 JPEG?在评分最高的答案中提到,并在尝试读取 EXIF 数据(空字典)时得到相同的结果。

我究竟做错了什么?如何使用 37510 或任何其他方式将自定义 EXIF 数据正确添加到图像?

Sta*_*tus 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)
Run Code Online (Sandbox Code Playgroud)

此后您应该能够将其读出来。另请参阅此答案以处理自定义元数据。