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

Sau*_*abh 9 python metadata image python-imaging-library

我正在寻找将自定义元数据写入图像(主要是jpeg,但也可能是其他人).到目前为止,我还没有能够通过PIL做到这一点(我在五号和我无法安装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
Run Code Online (Sandbox Code Playgroud)

我还发现,通过PIL JpegImagePlugin保存jpeg后,所有以前的元数据都会被您无法编辑的新数据覆盖?那是一个错误吗?

干杯,S

unu*_*tbu 19

python pyexiv2模块可以读/写元数据.

我认为有一组有效的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()
Run Code Online (Sandbox Code Playgroud)

读回来:

import pprint
filename='/tmp/image.jpg'
metadata = pyexiv2.ImageMetadata(filename)
metadata.read()
userdata=json.loads(metadata['Exif.Photo.UserComment'].value)
pprint.pprint(userdata)
Run Code Online (Sandbox Code Playgroud)

产量

{u'Category': u'Human',
 u'Location': {u'city': u'london'},
 u'Physical': {u'complexion': u'fair', u'skin_type': u'smooth'}}
Run Code Online (Sandbox Code Playgroud)

  • 这些策略似乎指向 [piexif](https://pypi.org/project/piexif/)。 (3认同)
  • 非常感谢!其实用pyexiv2,我什至可以写自定义元数据:` pyexiv2.xmp.register_namespace('/', 'custom') metadata['Xmp.custom.category'] = 'Human' ` 但问题是在(centos 5 + python2.6),我无法安装 pyexiv2 及其所有依赖项:P 所以我想看看 PIL 是否适合我! (2认同)
  • 对于Python 3.x,还有[** py3exiv2 **](http://www.py3exiv2.tuxfamily.org/)([tutorial](http://python3-exiv2.readthedocs.io/en/latest/tutorial .html))。我在系统(Ubutnu 16.04)上安装它时遇到一些问题,发现我首先必须安装最新版本的libexiv2-dev(`sudo apt-get install libexiv2-dev`),并且仅在此安装py3exiv2(`sudo)之后-H pip3安装py3exiv2`) (2认同)