我可以像这个例子一样使用 PIL吗?
我只需要读取数据,我正在寻找最简单的方法(我无法安装pyexiv)。
编辑:我不想相信这样做的唯一方法是使用一些需要 Exempi 和 Boost的库( python-xmp-toolkit,pyexiv2 ,...)。一定有别的选择!
我可以像这个例子一样使用 PIL吗?
我只需要读取数据,我正在寻找最简单的方法(我无法安装pyexiv)。
编辑:我不想相信这样做的唯一方法是使用一些需要 Exempi 和 Boost的库( python-xmp-toolkit,pyexiv2 ,...)。一定有别的选择!
好吧,我一直在寻找类似的东西,然后我遇到了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 对其进行解析。
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
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 工具包
对 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 数据。