XMP图像标记和Python

XMP图像标记和Python,python,xmp,Python,Xmp,如果我通过XMP在Python中标记一组图像,那么最好的方法是什么?我使用过Perl的Image::ExifTool,我非常习惯于它的可靠性。我的意思是,这件事从来没有在成千上万的图片上出现过 我发现,在一些重量级人物的支持下,比如欧洲航天局,但它显然被标记为不稳定 现在,假设我对C++感到满意,那么,用Python中的直接使用它有多简单?由于以前从未这样做过,我不确定我会报名参加什么 更新:我尝试了一些库,包括前面提到的工具包,它们仍然非常不成熟,存在明显的问题。我求助于实际编写一个基于Per

如果我通过XMP在Python中标记一组图像,那么最好的方法是什么?我使用过Perl的Image::ExifTool,我非常习惯于它的可靠性。我的意思是,这件事从来没有在成千上万的图片上出现过

我发现,在一些重量级人物的支持下,比如欧洲航天局,但它显然被标记为不稳定

现在,假设我对C++感到满意,那么,用Python中的直接使用它有多简单?由于以前从未这样做过,我不确定我会报名参加什么


更新:我尝试了一些库,包括前面提到的工具包,它们仍然非常不成熟,存在明显的问题。我求助于实际编写一个基于Perl的服务器,它接受XML请求来读取和写入元数据,并使用经过战斗测试的Image::EXIF。代码量实际上非常少,而且肯定比让Python库正常工作更痛苦。服务器解决方案与语言无关,因此是一种双重选择

他们的网站上说,python xmp工具包通过ctypes使用基于Adobe xmp工具包的Exempi。我想说的是,你不可能自己创建一个更好的C++代码包。如果它是不稳定的(例如,有车的),那么对您来说,创建补丁很可能比自己从头开始更便宜


然而,在您的特殊情况下,这取决于您需要多少功能。如果只需要一个函数,那么将C++代码打包成一个小的C扩展库或用Cython是可行的。当您需要所有功能和灵活性时,您必须手动或使用SWIG创建包装器,基本上重复其他人已经完成的工作。

您可以使用ImageMagic,IIRC也有一个Python模块。

我用Python xmp toolkit挣扎了几个小时,最终放弃了,只是结束了对他的通话

还有一种方法可以包装ExifTool(尽管比我创建的要好得多);我觉得值得将其移植到Python,以获得处理XMP的简单方法。

对于Python3.x,有一个支持编辑XMP元数据的

使用py3exiv2,您可以读取和写入所有标准元数据,创建自己的XMP命名空间或提取图像文件中嵌入的缩略图

我喜欢py3exiv2的一点是它构建在(C++)之上,看起来维护得很好

不过,在我的系统(Ubuntu 16.04)上安装它时,我确实遇到了一个问题。为了让它工作,我首先必须安装最新版本的libexiv2-dev(
sudo-apt-get-install-libexiv2-dev
),并且只有在安装了py3exiv2(
sudo-H-pip3-install-py3exiv2

下面是我如何使用py3exiv2编写新标记的:

import pyexiv2
metadata = pyexiv2.ImageMetadata("file_name.jpg")
metadata.read()
key = "Xmp.xmp.CustomTagKey"
value = "CustomTagValue"
metadata[key] = pyexiv2.XmpTag(key, value)
metadata.write()

(文档中还有一个链接)

对于将来发现此线程的人,我想与大家分享我的解决方案。它允许您使用
python-XMP-toolkit
进行基本的XMP主题字段标记编辑,但将实际使用
python-XMP-toolkit
的所有令人沮丧的废话抽象为一行命令

为您的平台安装
exempi
,然后运行

python3 -m pip install imgtag
现在您可以这样使用它:

从imgtag导入imgtag
#打开图像进行标记编辑
测试=ImgTag(
filename=“test.jpg”,#图像文件
force_case=“lower”#转换所有标记的大小写
#可以是'None'、'lower'、'upper'`
#默认值:无
strip=True,#从所有标记的末端去除空白
#默认值:True
no_duplicates=True#删除所有重复标记(区分大小写)
#默认值:True
)
#打印现有标签
打印(“当前标签:”)
对于测试中的标记。获取\u标记():
打印(“标签:”,标签)
#添加标签
测试。添加标签([“sleepy”,“happy”])
#删除标签
测试。删除_标签([“可爱”])
#设置标记,删除所有现有标记
测试。设置标签([“狗”,“好孩子])
#保存更改并关闭文件
test.close()
#重新打开以进行标记编辑
test.open()
#删除所有标签
测试。清除标签()
#删除ImgTag对象,自动保存并关闭文件
del(测试)

我还没有为其他XMP字段(如description、date、creator等)添加方法。也许有一天我会添加,但是如果您看看现有函数是如何工作的,您可能会自己找到添加方法的方法。如果您确实添加了更多方法,请提出拉取请求。:)

是的,我绝对不想与欧洲航天局竞争:)但我想知道直接使用Adobe工具包是否是一种捷径。我的目的非常有限。只需编写一些简单的标记-没有什么特别的东西。在这种情况下,我会说只需编写一个小的扩展模块。@Torsten,或者试试python xmp工具包。“不稳定”是模糊的,它可能会做他需要的事情。找到答案的唯一方法是尝试。如果您在MAC上构建Exempi,那么您就是SOL,因为没有任何一个构建(macports、brew)安装CtypesHanks所需的模块以获得安装说明。非常有用。