2011-12-21 34 views
6

Tôi đang tìm cách ghi siêu dữ liệu tùy chỉnh vào hình ảnh (chủ yếu là jpeg, nhưng cũng có thể là những hình ảnh khác). Cho đến nay tôi đã không thể làm điều đó thông qua PIL tốt hơn (tôi đang ở trên centos 5 & Tôi không thể cài đặt pyexiv) Tôi hiểu rằng tôi có thể cập nhật một số thẻ được xác định trước, nhưng tôi cần phải tạo các trường tùy chỉnh/tags! Điều đó có thể được thực hiện?Viết siêu dữ liệu tùy chỉnh phức tạp trên hình ảnh qua python

Dữ liệu này sẽ được tạo bởi người dùng, vì vậy tôi sẽ không biết các thẻ đó là gì trước khi bàn tay hoặc những gì chúng chứa. Tôi cần cho phép họ tạo thẻ/thẻ phụ & rồi ghi dữ liệu cho họ. Ví dụ, ai đó có thể muốn tạo siêu dữ liệu này trên một hình ảnh cụ thể:

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 

Tôi cũng phát hiện ra rằng khi tiết kiệm một jpeg qua PIL JpegImagePlugin, tất cả các siêu dữ liệu trước đó được ghi đè bằng dữ liệu mới mà bạn không nhận được để chỉnh sửa? Đó có phải là một lỗi không?

Chúc mừng, S

Trả lời

12

Các python pyexiv2 module có thể đọc/ghi siêu dữ liệu.

Tôi nghĩ rằng có một tập hợp hạn chế các thẻ EXIF ​​hợp lệ. Tôi không biết làm thế nào, hoặc nếu có thể tạo thẻ tùy chỉnh của riêng bạn. Tuy nhiên, bạn có thể sử dụng thẻ Exif.Photo.UserComment, và điền nó với 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() 

Và để đọc nó trở lại:

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

sản lượng

{u'Category': u'Human', 
u'Location': {u'city': u'london'}, 
u'Physical': {u'complexion': u'fair', u'skin_type': u'smooth'}} 
+1

Rất cám ơn cho điều này ! Trên thực tế, với pyexiv2, tôi thậm chí có thể viết tùy chỉnh metadata: ' pyexiv2.xmp.register_namespace ('/', 'tùy chỉnh') metadata [ 'Xmp.custom.category'] = 'Nhân' ' Nhưng vấn đề là trên (centos 5 + python2.6), tôi không thể có được pyexiv2 cài đặt với tất cả các phụ thuộc của nó: P Vì vậy, tôi đang cố gắng để xem nếu PIL làm việc cho tôi! – Saurabh

+1

Cảm ơn bạn đã cho biết cách tạo thẻ tùy chỉnh. Xin lỗi tôi không biết nhiều về CentOS (và tôi giả sử bạn đã thử 'yum install pyexiv2'.) Thật không may, AFAIK, PIL 1.1.7 [có thể đọc nhưng không viết siêu dữ liệu EXIF] (http://stackoverflow.com/ a/1608545/190597) và [hỗ trợ ghi EXIF ​​chưa được thêm vào PIL 1.2] (https://bitbucket.org/effbot/pil-2009-raclette/src/cd403356263f/CHANGES). – unutbu

+0

Bạn nói đúng. Tôi từ bỏ PIL. Nhưng tôi đã chấp nhận bài viết trước của bạn như là câu trả lời của tôi vì nó mang lại cho tôi một nền tảng công bằng để tiếp tục! Cảm ơn! – Saurabh

Các vấn đề liên quan