【问题标题】:Python - add arbitrary EXIF data to image (UserComment field)?Python - 将任意 EXIF 数据添加到图像(UserComment 字段)?
【发布时间】:2020-08-20 21:02:30
【问题描述】:

我需要将任意数据添加到 JPEG 图像。具体来说,我需要存储两个整数。通过阅读有关 EXIF 数据,我的印象是无法制作自己的自定义字段,而是必须使用 EXIF 标准字段。

这篇帖子Custom Exif Tags 但是提到了一个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))

这很好用,如果我在没有 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 数据的图像,我都会得到相同的空字典结果。

在有人将此标记为重复之前,我还尝试了这篇帖子 How can I insert EXIF/other metadata into a JPEG stored in a memory buffer? 在评分最高的答案中提到的内容,并在尝试读取 EXIF 数据(空字典)时得到了相同的结果。

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

【问题讨论】:

    标签: python exif


    【解决方案1】:

    您在handling 传递给piexif.dump 的数据中缺少一个步骤:

    exif_ifd = {piexif.ExifIFD.UserComment: 'my message'}
    
    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 tags 是将任何类型的元数据添加到图像的最简单方法。简单实用。示例:

      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())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-18
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-27
        • 2020-05-08
        相关资源
        最近更新 更多