Запись сложных пользовательских метаданных на изображения через Python - PullRequest
9 голосов
/ 21 декабря 2011

Я хочу записать собственные метаданные на изображения (в основном в формате 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

Я также обнаружил, что при сохранении JPEG через PIL JpegImagePlugin все предыдущие метаданные перезаписываются новыми данными, которые вы не можете редактировать? Это ошибка?

Ура, S

1 Ответ

18 голосов
/ 21 декабря 2011

Модуль 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()

И прочитать его обратно:

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

1011 * выходы *

{u'Category': u'Human',
 u'Location': {u'city': u'london'},
 u'Physical': {u'complexion': u'fair', u'skin_type': u'smooth'}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...