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

Python XMP工具包在尝试读取图像元数据时过于严格(“无法识别的TIFF前缀”),python,image,python-imaging-library,exif,xmp,Python,Image,Python Imaging Library,Exif,Xmp,我正在尝试使用。但是,我遇到了几个库无法加载任何XMP数据的图像: >>> from libxmp.utils import file_to_dict >>> file_to_dict("/path/to/file.jpg") Unrecognized TIFF prefix {} 如果我尝试使用枕头提取图像元数据,则会出现类似错误: >>> from PIL import Image >>> Image.open(fil

我正在尝试使用。但是,我遇到了几个库无法加载任何XMP数据的图像:

>>> from libxmp.utils import file_to_dict
>>> file_to_dict("/path/to/file.jpg")
Unrecognized TIFF prefix
{}
如果我尝试使用枕头提取图像元数据,则会出现类似错误:

>>> from PIL import Image
>>> Image.open(file_path)._getexif()
  File "<string>", line unknown
SyntaxError: not a TIFF IFD
来自PIL导入映像的
>>
>>>Image.open(文件路径)。\u getexif()
文件“”,行未知
SyntaxError:不是一个TIFF IFD
这些图像在浏览器中正确显示,对文件运行PIL的
verify()
方法不会引发任何异常,如果以文本形式打开图像,则可以看到格式正确的图像元数据。最后,(显然不那么挑剔的)exif\u read\u data可以毫无问题地读取这些图像的所有元数据


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

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

导入libxmp
def parse_xmp(路径):
data=libxmp.utils.file_to_dict(路径)
如果没有数据:
数据=dirty\u parse\u xmp(路径)
返回数据
def dirty_parse_xmp(路径):
#在文件中查找XMP数据
xmp_数据=“”
xmp_start=False
将开放(路径)作为内嵌:
对于填充中的线:
如果xmp_未启动:
xmp_已启动
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)