我可以像this example一样使用PIL吗?
我只需读取数据,我正在寻找最简单的方法(我无法安装 pyexiv )< / em>的
编辑:我不想相信这样做的唯一方法是使用需要Exempi的库(python-xmp-toolkit,pyexiv2,...)和提升。必须有另一种选择!
答案 0 :(得分:10)
好吧,我正在寻找类似的东西,然后我遇到了PHP equivalent问题,我将anwer翻译成了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解析它。
答案 1 :(得分:6)
可以在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
答案 2 :(得分:3)
答案 3 :(得分:2)
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 Toolkit
答案 4 :(得分:1)
通过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数据。
答案 5 :(得分:0)
读取原始文件元数据不起作用
该线程始于8年前,情况可能有所发展。我对xmp和xml不太了解,我想我不想成为。我需要做的是将元数据读取和写入图像文件(关键字评级等)。
因此python-xmp-toolkit似乎是最好的方法。据我了解,这是基于Exempi的python层。
因此,jpg文件一切正常。我得到了一个与键的字典:
http://ns.adobe.com/xap/1.0/mm/
http://purl.org/dc/elements/1.1/
http://ns.adobe.com/camera-raw-settings/1.0/
http://ns.adobe.com/lightroom/1.0/
可以访问那些我想要的元数据。
但是当我想对原始或sidecar文件执行相同的操作时。 .raf或.xmp字典为空。我在做什么错了?
from libxmp.utils import file_to_dict
xmpPath = '/Users/me/image0001.jpg'
xmpDict = file_to_dict(xmpPath)
for key in xmpDict.keys():
print(key)