在Python中读取图像XMP数据

时间:2011-07-25 21:39:54

标签: python image python-imaging-library xmp

我可以像this example一样使用PIL吗?

我只需读取数据,我正在寻找最简单的方法(我无法安装 pyexiv )< / em>的

编辑:我不想相信这样做的唯一方法是使用需要Exempi的库(python-xmp-toolkitpyexiv2,...)和提升。必须有另一种选择!

6 个答案:

答案 0 :(得分:10)

好吧,我正在寻找类似的东西,然后我遇到了PHP equivalent问题,我将anwer翻译成了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)

然后,您可以转换xmp_str并使用XML API解析它。

答案 1 :(得分:6)

可以在applist

中找到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

答案 2 :(得分:3)

我也有兴趣知道是否有一个'正确'的简单方法来做到这一点。

与此同时,我在PyAVM中使用纯Python实现了读取XMP数据包。相关代码为here。也许这会对你有用吗?

答案 3 :(得分:2)

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())

或者您可以使用Python XMP Toolkit

答案 4 :(得分:1)

通过PIL源(1.1.7)搜索告诉我它可以识别Tiff文件中的XMP信息,但是我找不到任何有关在应用程序级别使用PIL处理XMP信息的文档或未记录的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数据。

答案 5 :(得分:0)

读取原始文件元数据不起作用

该线程始于8年前,情况可能有所发展。我对xmp和xml不太了解,我想我不想成为。我需要做的是将元数据读取和写入图像文件(关键字评级等)。

因此python-xmp-toolkit似乎是最好的方法。据我了解,这是基于Exempi的python层。

因此,jpg文件一切正常。我得到了一个与键的字典:

http://ns.adobe.com/xap/1.0/mm/

http://ns.adobe.com/xap/1.0/

http://purl.org/dc/elements/1.1/

http://ns.adobe.com/camera-raw-settings/1.0/

http://ns.adobe.com/lightroom/1.0/

http://ns.adobe.com/tiff/1.0/

http://ns.adobe.com/exif/1.0/

可以访问那些我想要的元数据。

但是当我想对原始或sidecar文件执行相同的操作时。 .raf或.xmp字典为空。我在做什么错了?

from libxmp.utils import file_to_dict
xmpPath = '/Users/me/image0001.jpg'

xmpDict = file_to_dict(xmpPath)
for key in xmpDict.keys():
    print(key)