尝试读取图像元数据时,Python XMP Toolkit过于严格(“无法识别的TIFF前缀”)

时间:2015-01-02 18:06:35

标签: python image python-imaging-library exif xmp

我试图使用Python XMP Toolkit从python中的JPG读取XMP数据。但是,我遇到了几个图像,其中库无法加载任何XMP数据:

>>> from libxmp.utils import file_to_dict
>>> file_to_dict("/path/to/file.jpg")
Unrecognized TIFF prefix
{}

如果我尝试使用Pillow提取图像元数据,我会收到类似的错误:

>>> from PIL import Image
>>> Image.open(file_path)._getexif()
  File "<string>", line unknown
SyntaxError: not a TIFF IFD

这些图片在浏览器中正确显示,在文件上运行PIL的verify()方法不会引发任何异常,如果我将图像作为文本打开,我可以看到图像元数据一种看起来正确的格式。最后,(显然不那么挑剔)exif_read_data function in PHP可以毫无问题地读取这些图像的所有元数据。

是否有办法(1)修复图片,使其不再有错误的TIFF前缀&#39;或者(2)在尝试读取XMP元数据时告诉Pillow或libxmp不那么严格?

1 个答案:

答案 0 :(得分:1)

这似乎并不完全理想,但我找到了一个对我来说可能“足够好”的解决方案。以下是一些受this question中答案启发的代码。

import libxmp

def parse_xmp(path):
    data = libxmp.utils.file_to_dict(path)
    if not data:
        data = dirty_parse_xmp(path)
    return data


def dirty_parse_xmp(path):

    # Find the XMP data in the file
    xmp_data = ''
    xmp_started = False
    with open(path) as infile:
        for line in infile:
            if not xmp_started:
                xmp_started = '<x:xmpmeta' in line
            if xmp_started:
                xmp_data += line
                if line.find('</x:xmpmeta') > -1:
                    break
        else:  # if XMP data is not found
            return {}
    xmp_open_tag = xmp_data.find('<x:xmpmeta')
    xmp_close_tag = xmp_data.find('</x:xmpmeta>')
    xmp_str = xmp_data[xmp_open_tag:xmp_close_tag + 12]

    # Pass just the XMP data to libxmp as a string
    meta = libxmp.XMPMeta()
    meta.parse_from_str(xmp_str)
    return libxmp.utils.object_to_dict(meta)