pythonxmp Toolkit在尝试读取图像metad时过于严格(“无法识别的TIFF前缀”)

2024-09-28 21:47:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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提取图像元数据,则会出现类似的错误:

^{pr2}$

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

有没有一种方法可以(1)修复图像,使其不再具有错误的“TIFF前缀”,或者(2)告诉Pillow或libxmp在尝试读取XMP元数据时不要太严格?在


Tags: to数据方法from图像错误utilstoolkit
1条回答
网友
1楼 · 发布于 2024-09-28 21:47:38

这看起来不太理想,但我找到了一个对我来说“足够好”的解决方案。下面是一些受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)

相关问题 更多 >