Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过python在图像上编写复杂的自定义元数据_Python_Image_Metadata_Python Imaging Library - Fatal编程技术网

通过python在图像上编写复杂的自定义元数据

通过python在图像上编写复杂的自定义元数据,python,image,metadata,python-imaging-library,Python,Image,Metadata,Python Imaging Library,我希望在图像上写入自定义元数据(主要是JPEG,但也可以是其他格式)。到目前为止,我还没有能够通过PIL更好地做到这一点(我在centos 5上&我无法安装pyexiv) 我知道我可以更新一些预定义的标记,但我需要创建自定义字段/标记!那能做到吗 这些数据将由用户创建,所以我不知道这些标签是什么,或者它们包含什么。我需要允许他们创建标记/子标记,然后为它们写入数据。例如,有人可能希望在特定图像上创建此元数据: Category : Human Physical : skin_type

我希望在图像上写入自定义元数据(主要是JPEG,但也可以是其他格式)。到目前为止,我还没有能够通过PIL更好地做到这一点(我在centos 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时,所有以前的元数据都会被无法编辑的新数据覆盖?那是虫子吗

干杯, python可以读/写元数据

我认为有效的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'}}

安装软件包并将自定义数据保存到
exiffd.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。

非常感谢!实际上,使用pyexiv2,我甚至可以编写自定义元数据:`pyexiv2.xmp.register_namespace('/','custom')metadata['xmp.custom.category']='Human'`但问题是在(centos 5+python2.6)上,我无法安装pyexiv2及其所有依赖项:P,所以我正在尝试看看PIL是否适合我!感谢您展示如何制作自定义标签。抱歉,我对CentOS了解不多(我假设您已经尝试过
yum安装pyexiv2
),不幸的是,AFAIK、PIL 1.1.7和.Python 3.x还有()。我在我的系统(Ubutnu 16.04)上安装它时遇到一些问题,发现我首先必须安装最新版本的libexiv2 dev(
sudo-apt-get-install-libexiv2 dev
),只有在这次安装py3exiv2(
sudo-H pip3-install-py3exiv2
)@datanoveler:我使用python修改exif数据的经验已经过时。不过,您可以通过以下几种方式找到答案:(1)搜索StackOverflow,按“最新”排序,然后查看正在使用的库。(2) 谷歌在“exif Python 3 write”上的简单搜索找到了有趣的线索。(3) 你也可以选择exif相关的软件包。这些策略似乎指向。