python - Python - 将任意 EXIF 数据添加到图像(UserComment 字段)?
问题描述
我需要将任意数据添加到 JPEG 图像。具体来说,我需要存储两个整数。通过阅读有关 EXIF 数据的信息,我的印象是无法制作自己的自定义字段,而是必须使用 EXIF 标准字段。
然而,这篇Custom Exif Tags帖子提到了一个UserComment
我认为可以写入字符串的字段。如果这是唯一的选择,那很好,因为我可以在逗号分隔的字符串中存储两个整数,例如“2,5”来存储整数 2 和 5,所以如果我只有一个存储字符串可以使用它仍然足够.
我从谷歌图片搜索中下载了一些随机图片,发现它们似乎没有 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 数据的图像,我都会得到相同的空字典结果。
在有人将此标记为重复之前,我还尝试了这篇文章如何将 EXIF/其他元数据插入存储在内存缓冲区中的 JPEG 中?在评分最高的答案中提及并在尝试读取 EXIF 数据(空字典)时得到相同的结果。
我究竟做错了什么?如何使用 37510 或任何其他方式将自定义 EXIF 数据正确添加到图像?
解决方案
推荐阅读
- android - 关于通过 Google Play 控制台发布代号一个应用程序的警告消息 Start To Roll Out Button disabled
- c# - .net 核心中的 IHttpClientFactory
- postgresql - PostgreSQL 11 中的表分区与自动分区创建?
- html - 密码与 Angular CLI 中的模式不匹配
- arcgis - 在哪里可以找到 ArcGIS 服务 url 以及如何创建?如何从服务器上传和查看内容
- spring-boot - jasypt-spring-boot-starter:密码不是 ascii
- vba - 如何检查重复名称,但避免自行激活
- java - 如何将我的一个片段数据传递给同一活动中的另一个片段?
- ruby-on-rails - Select2 没有在下拉菜单中显示搜索选项?
- javascript - 如何从父类别中排除特定的子类别帖子?