2011-07-25 19 views

Respuesta

3

También estoy interesado en saber si existe una forma 'adecuada' fácil de hacerlo.

Mientras tanto, he implementado la lectura de paquetes XMP usando Python puro en PyAVM. El código relevante es here. Tal vez esto te sea útil?

1

Una búsqueda a través de la fuente PIL (1.1.7) me dice que puede reconocer información XMP en archivos Tiff, pero no puedo encontrar ninguna evidencia de una API documentada o no documentada para trabajar con información XMP usando PIL en el nivel de aplicación .

A partir de los cambios en los archivos incluidos en la fuente:

+ 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. 

lo tanto, el soporte para XMP se limita a TIFF, y sólo permite que la información XMP para ser retenido cuando se carga una imagen TIFF, posiblemente cambió, y se guarda . La aplicación no puede acceder o crear datos XMP.

7

Bueno, yo estaba buscando algo similar, entonces me encontré con la cuestión PHP equivalent y traduje la anwer a Python:

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) 

luego se puede convertir xmp_str y analizarlo con una API XML.

+0

Me gusta ... siempre tuve problemas con las palabras clave truncadas al usar paquetes como PIL para acceder a los datos. Otro beneficio es que al leerlo desde el archivo jpg no hay dependencias al escribir un paquete reutilizable. – 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()) 

O puede usar el Python XMP Toolkit

5

metadatos XMP se puede encontrar en applist.

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

Agradable, ¿es ese documento en cualquier lugar? Solo encontré https://github.com/python-pillow/Pillow/blob/da8f2737a8a325ed5bb1d24a777a0b4d3ddaa7d8/PIL/JpegImagePlugin.py#L57-L128 –

+0

@TobiasKienzler sí esto no está documentado – CodeColorist