Dim*_*ims 11 python exif python-imaging-library
如何使用 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)
Run Code Online (Sandbox Code Playgroud)
但在图像中什么也看不到 XnView。我究竟做错了什么?
PS我不需要写相机模型,曝光和其他东西。我想编写自己的自定义元数据。
查看有关如何使用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)
Run Code Online (Sandbox Code Playgroud)
您可以在此处检查可以使用piexif 编辑的所有元数据字段。
我找不到关于自定义标签的明确答案(这些 链接建议您可以使用第三方工具),但查看规范只提供了定义的标签,所以我会说不,您不能自己制作元数据标签,至少不是直接的。
所以你可以做的是将你自己的数据写入任何定义的标签。最好为此使用MakerNote标签 - 大多数相机制造商将他们自己的自定义元数据存储在那里。将您的自定义标志转储到一个字节字符串中,然后再将其填充到 MakerNote 标签中:
from PIL import Image
import piexif
import pickle
tags = {'url_current' : '/sf/ask/3691059991/',
'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)
Run Code Online (Sandbox Code Playgroud)
因为它是你自己的格式,所以你需要自己读出来:
img = Image.open('image.jpg')
raw = img.getexif()[piexif.ExifIFD.MakerNote]
tags = pickle.loads(raw)
Run Code Online (Sandbox Code Playgroud)
exiftool 会看到图像有一个 MakerNote,但不会识别它:
C:\> exiftool image.jpg -MakerNote
Warning: [minor] Unrecognized MakerNotes - image.jpg
Run Code Online (Sandbox Code Playgroud)
您也可以将其存储在 UserComment 标记中 - 存储方式相同。
C:\>exiftool image.jpg -UserComment
User Comment : Ç.ò^}ö(î.url_currentöî,/sf/ask/3691059991/öî.contains_fishöëK.G??.?DB?äu.
Run Code Online (Sandbox Code Playgroud)
PS JPEG 图像中的元数据限制为 64kB
| 归档时间: |
|
| 查看次数: |
7899 次 |
| 最近记录: |