2011-07-25 15 views
11

this exampleのようにPILを使用できますか? データを読み取るためにイメージを読むPythonのXMPデータ

は私だけ必要、と私はそれが(私はpyexivをインストールすることはできません)一番簡単な最も簡単な方法を探しています。

編集:Exempiとブーストを必要とする、私はこれを行うための唯一の方法は、いくつかのライブラリー(python-xmp-toolkitpyexiv2、...)であることを信じたくない。別のオプションが必要です!

答えて

3

私はまた、これを行うための「適切な」簡単な方法があるかどうかを知りたいと考えています。

私はPyAVMで純粋なPythonを使ってXMPパケットを読み込みました。関連コードはhereです。多分、これはあなたにとって有益でしょうか?

1

PILソース(1.1.7)を検索すると、TiffファイルのXMP情報を認識できることがわかりますが、アプリケーションレベルでPILを使用してXMP情報を扱うための文書化されたAPIまたは文書化されていないAPIの証拠は見つかりません。 CHANGESファイルから

は、ソースに含ま:

+ Support for preserving ICC profiles (by Florian Böch via Tim Hatch). 

    Florian writes: 

    It's a beta, so still needs some testing, but should allow you to: 
    - retain embedded ICC profiles when saving from/to JPEG, PNG, TIFF. 
    Existing code doesn't need to be changed. 
    - access embedded profiles in JPEG, PNG, PSD, TIFF. 

    It also includes patches for TIFF to retain IPTC, Photoshop and XMP 
    metadata when saving as TIFF again, read/write TIFF resolution 
    information correctly, and to correct inverted CMYK JPEG files. 

だから、XMPのサポートは、TIFFに制限され、TIFFイメージがロードされたときにのみ、XMP情報を保持することを可能にする、おそらく変更、および保存。アプリケーションはXMPデータにアクセスしたり、XMPデータを作成することはできません。

7

まあ、私は似たような探していた、そして私はPHP equivalent質問に出くわしたと私は、Pythonにanwerを翻訳:あなたは、その後xmp_strを変換し、XML APIとそれを解析することができます

f = 'example.jpg' 
fd = open(f) 
d= fd.read() 
xmp_start = d.find('<x:xmpmeta') 
xmp_end = d.find('</x:xmpmeta') 
xmp_str = d[xmp_start:xmp_end+12] 
print(xmp_str) 

+0

私は... PILのようなパッケージを使用してデータにアクセスすると、切り捨てられたキーワードに問題があるのが好きです。もう1つの利点は、jpgからそれを読み取ると、再利用可能なパッケージを作成するときに依存性がなくなることです。 – sthzg

1
with open(imgFileName, "rb") as fin: 
    img = fin.read() 
imgAsString=str(img) 
xmp_start = imgAsString.find('<x:xmpmeta') 
xmp_end = imgAsString.find('</x:xmpmeta') 
if xmp_start != xmp_end: 
    xmpString = imgAsString[xmp_start:xmp_end+12] 

xmpAsXML = BeautifulSoup(xmpString) 
print(xmpAsXML.prettify()) 

それとも

5

XMPメタデータはapplistで見つけることができますPythonのXMPツールキットを使用することができます。

from PIL import Image 
with Image.open(filename) as im: 
    for segment, content in im.applist: 
     marker, body = content.split('\x00', 1) 
     if segment == 'APP1' and marker == 'http://ns.adobe.com/xap/1.0/': 
      # parse the XML string with any method you like 
      print body 
+0

いいです、どこの文書ですか?私だけが見つかりましたhttps://github.com/python-pillow/Pillow/blob/da8f2737a8a325ed5bb1d24a777a0b4d3ddaa7d8/PIL/JpegImagePlugin.py#L57-L128 –

+0

@TobiasKienzlerはいこれは文書化されていません – CodeColorist