如何使用Python将自定义元数据写入JPEG图片?

13
使用Python如何将自定义元数据写入JPEG图片?

我已经尝试过

import piexif
exif_dict = {
                'uwi': myvalue1,
                'activity_type': myvalue2,
                'prediction': myvalue3,
                'url_current': myvalue4,
                'url_previous': mavalue5
            }
exif_bytes = piexif.dump(exif_dict)
with open(filename, "w") as fp:
    test_image.save(fp, "JPEG", exif=exif_bytes)

但在 XnView 图像中没有看到任何内容。我做错了什么?

附言:我不需要写相机型号、曝光和其他东西。 我想写自己的自定义元数据。


这个回答解决了你的问题吗?如何在Python中修改EXIF数据 - Tabish Mir
3个回答

10

我无法找到一个关于自定义标签的明确答案(这些 链接 建议使用第三方工具),但是查看规格说明只给出了定义好的标签,所以我要说不行,你不能直接创建自己的元数据标签。


所以你可以将自己的数据写入任何一个已定义标签中。最好使用MakerNote标签 - 大多数相机制造商会在那里存储他们自己的自定义元数据。在将其放入MakerNote标签之前,将自定义标志转储为字节字符串:
from PIL import Image
import piexif
import pickle

tags = {'url_current'   : 'https://dev59.com/4FQJ5IYBdhLWcg3w96zx',
        'contains_fish' : False,
        3               : 0.14159265358979323, }

data = pickle.dumps(tags)
exif_ifd = {piexif.ExifIFD.MakerNote: data}

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

img = Image.new('RGB', (500, 500), 'green')
exif_dat = piexif.dump(exif_dict)
img.save('image.jpg',  exif=exif_dat)

因为这是您自己的格式,您需要自己读取它:

img = Image.open('image.jpg')
raw = img.getexif()[piexif.ExifIFD.MakerNote]
tags = pickle.loads(raw)

exiftool会看到图像有一个MakerNote,但无法识别它:

C:\> exiftool image.jpg -MakerNote
Warning: [minor] Unrecognized MakerNotes - image.jpg

你也可以将其存储在UserComment标签中 - 存储方式相同。

C:\>exiftool image.jpg -UserComment
User Comment                    : Ç.ò^}ö(î.url_currentöî,https://dev59.com/4FQJ5IYBdhLWcg3w96zxöî.contains_fishöëK.G?┬.╡DB╤äu.

P.S. jpeg图片中元数据的限制为limit


1
我在img.getexif()[[piexif.ExifIFD.MakerNote]]中遇到了关键错误,制造商注释是一个整数,在将其转换为字典后在img.getexif中不存在。 - Ricardo Guerreiro

7

请查看文档了解如何使用piexif。例如,您做错的事情是尝试编写自定义元数据并使用open打开文件,而不是使用来自PIL模块的Image打开。

从文档中缩小示例,您可以像这样操作:

from PIL import Image
import piexif

zeroth_ifd = {
              piexif.ImageIFD.Make: u"Canon",
              piexif.ImageIFD.XResolution: (96, 1),
              piexif.ImageIFD.YResolution: (96, 1),
              piexif.ImageIFD.Software: u"piexif"
              }
exif_ifd = {
            piexif.ExifIFD.DateTimeOriginal: u"2099:09:29 10:10:10",
            piexif.ExifIFD.LensMake: u"LensMake",
            piexif.ExifIFD.Sharpness: 65535,
            piexif.ExifIFD.LensSpecification: ((1, 1), (1, 1), (1, 1), (1, 1)),
            }
gps_ifd = {
           piexif.GPSIFD.GPSVersionID: (2, 0, 0, 0),
           piexif.GPSIFD.GPSAltitudeRef: 1,
           piexif.GPSIFD.GPSDateStamp: u"1999:99:99 99:99:99",
           }
first_ifd = {
             piexif.ImageIFD.Make: u"Canon",
             piexif.ImageIFD.XResolution: (40, 1),
             piexif.ImageIFD.YResolution: (40, 1),
             piexif.ImageIFD.Software: u"piexif"
             }

exif_dict = {"0th":zeroth_ifd, "Exif":exif_ifd, "GPS":gps_ifd, "1st":first_ifd, "thumbnail":thumbnail}
exif_bytes = piexif.dump(exif_dict)
im = Image.open("foo.jpg")
im.save("out.jpg", exif=exif_bytes)

您可以在这里使用 piexif 查看所有可编辑的元数据字段


4
在JPEG格式中保存自定义元数据是否可行?我不想保存相机型号等信息,这对我来说是不必要的。 - Dims
我也不是打开现有的图像,而是创建自己的图像。 - Dims
1
原帖强调了他希望添加“自定义”属性。给出的示例很有帮助,但它明确地只引用了EXIF标准属性。 - MikeMontana

0

我不懂Python,但标记FF E0-EF(可能排除,尽管对于exif并非强制要求,E1被用于exif),它精确地用于应用程序。我刚刚使用了标记FFE2包含了一个JPEG文件(用于自定义缩略图格式),该JPEG可以正常读取。


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