我正在寻找将自定义元数据写入图像(主要是jpeg,但也可能是其他人)。到目前为止,我还没有能够通过PIL做到这一点(我是在5号和我无法安装pyexiv) 我知道我可以更新一些预定义的标签,但我需要创建自定义字段/标签!可以这样做吗?
这些数据将由用户创建,因此我不知道这些标记是手头的或它们包含的内容。我需要允许他们创建标签/子标签&然后为他们写数据。例如,有人可能想要在特定图像上创建此元数据:
Category : Human
Physical :
skin_type : smooth
complexion : fair
eye_color: blue
beard: yes
beard_color: brown
age: mid
Location :
city: london
terrain: grass
buildings: old
我还发现,在通过PIL JpegImagePlugin保存jpeg后,所有以前的元数据都会被您无法编辑的新数据覆盖?这是一个错误吗?
干杯, 小号
答案 0 :(得分:18)
python pyexiv2 module可以读/写元数据。
我认为有一组有效的EXIF标签。我不知道如何,或者是否可以创建自己的自定义标签。但是,您可以使用Exif.Photo.UserComment标记,并使用JSON填充它:
import pyexiv2
import json
metadata = pyexiv2.ImageMetadata(filename)
metadata.read()
userdata={'Category':'Human',
'Physical': {
'skin_type':'smooth',
'complexion':'fair'
},
'Location': {
'city': 'london'
}
}
metadata['Exif.Photo.UserComment']=json.dumps(userdata)
metadata.write()
并回读:
import pprint
filename='/tmp/image.jpg'
metadata = pyexiv2.ImageMetadata(filename)
metadata.read()
userdata=json.loads(metadata['Exif.Photo.UserComment'].value)
pprint.pprint(userdata)
产量
{u'Category': u'Human',
u'Location': {u'city': u'london'},
u'Physical': {u'complexion': u'fair', u'skin_type': u'smooth'}}
答案 1 :(得分:1)
安装piexif软件包并将自定义数据保存到ExifIFD.UserComment
字段中可能会更方便。
样本数据:
userdata = {
'Category': 'Human',
'Physical': {
'skin_type': 'smooth',
'complexion': 'fair'
},
'Location': {
'city': 'london'
}
}
将数据编码为图像:
import json
import piexif
import piexif.helper
# %% Write out exif data
# load existing exif data from image
exif_dict = piexif.load(filename)
# insert custom data in usercomment field
exif_dict["Exif"][piexif.ExifIFD.UserComment] = piexif.helper.UserComment.dump(
json.dumps(userdata),
encoding="unicode"
)
# insert mutated data (serialised into JSON) into image
piexif.insert(
piexif.dump(exif_dict),
filename
)
从图像解码数据:
# %% Read in exif data
exif_dict = piexif.load(filename)
# Extract the serialized data
user_comment = piexif.helper.UserComment.load(exif_dict["Exif"][piexif.ExifIFD.UserComment])
# Deserialize
d = json.loads(user_comment)
print("Read in exif data: %s" % d)
请注意,仅支持JPEG,WebP和TIFF。