Python XMP 工具包在尝试读取图像元数据时过于严格 ("Unrecognized TIFF prefix")
Python XMP Toolkit is too strict ("Unrecognized TIFF prefix") when trying to read image metadata
我正在尝试使用 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 prefix' 或 (2) 在尝试读取 XMP 元数据时告诉 Pillow 或 libxmp 不那么严格?
这似乎并不完全理想,但我找到了一个可能 'good enough' 适合我的解决方案。这是一些受 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)
我正在尝试使用 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 prefix' 或 (2) 在尝试读取 XMP 元数据时告诉 Pillow 或 libxmp 不那么严格?
这似乎并不完全理想,但我找到了一个可能 'good enough' 适合我的解决方案。这是一些受 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)