19

我可以像这个例子一样使用 PIL吗?

我只需要读取数据,我正在寻找最简单的方法(我无法安装pyexiv

编辑:我不想相信这样做的唯一方法是使用一些需要 Exempi 和 Boost的库( python-xmp-toolkitpyexiv2 ,...)。一定有别的选择!

4

5 回答 5

13

好吧,我一直在寻找类似的东西,然后我遇到了PHP 等效问题,并将答案翻译为 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 对其进行解析。

于 2011-11-14T10:20:21.603 回答
11

XMP 元数据可以在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
于 2015-08-14T03:24:13.187 回答
3
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 工具包

于 2013-01-31T23:50:56.977 回答
3

我也很想知道是否有一种“适当”的简单方法可以做到这一点。

同时,我已经在PyAVM中使用纯 Python 实现了读取 XMP 数据包。相关代码在这里。也许这对你有用?

于 2011-07-26T02:13:24.783 回答
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 数据。

于 2011-07-26T23:05:50.233 回答