English 中文(简体)
XMP图像标记和Python
原标题:
  • 时间:2009-02-01 16:28:14
  •  标签:

如果我要使用Python标记一堆图像的XMP,最好的方法是什么?我曾经使用过Perl的Image::ExifTool,非常习惯它的可靠性。我的意思是这个工具在成千上万的图像中从未出现故障。

我找到了这个,由欧洲航天局等重量级机构支持,但它明显标记为不稳定。

假设我已经熟悉 C++ ,那么直接在 Python 中使用 Adobe XMP 工具包有多容易?由于我以前从未这样做过,我不确定我会遇到什么问题。

更新: 我尝试了一些库,包括前面提到的工具包,它们仍然非常不成熟,存在明显的问题。我最终编写了一个基于Perl的服务器,用于接受XML请求以读取和写入元数据,并使用经过测试的Image::EXIF。代码量实际上非常小,绝对比试图使Python库工作更好。服务器解决方案是语言不可知的,因此它是一个两全其美的选择。

最佳回答

嗯,他们的网站说python-xmp-toolkit使用Exempi,该工具基于Adobe XMP工具包,通过ctypes实现。我的意思是你很难自己创建更好的C++代码封装。如果它不稳定(即有漏洞),那么你最好是创建补丁,而不是从头开始自己做。

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

问题回答

我与python-xmp-toolkit挣扎了数小时,最终放弃,只是包装了对ExifTool的调用。

有一个Ruby库包装了ExifTool(尽管比我创建的要好得多); 我觉得将其移植到Python中是值得的,以便简单处理XMP。

对于Python 3.x,有一个名为py3exiv2的工具,支持编辑XMP元数据。

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

我喜欢py3exiv2的一点是它建立在好维护的(C++)exiv2库之上。

我在安装它到我的系统(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包索引(PyPI)上发布了一个名为的软件包。它使用python-xmp-toolkit进行基本的XMP主题字段标签编辑,但将实际使用python-xmp-toolkit的所有令人沮丧的无聊部分抽象为一行命令。

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

python3 -m pip install imgtag

现在您可以像这样使用它:

from imgtag import ImgTag

# Open image for tag editing
test = ImgTag(
           filename="test.jpg", # The image file
           force_case="lower",  # Converts the case of all tags
                                # Can be `None`, `"lower"`, `"upper"`
                                # Default: None
           strip=True,          # Strips whitespace from the ends of all tags
                                # Default: True
           no_duplicates=True   # Removes all duplicate tags (case sensitive)
                                # Default: True
       )

# Print existing tags
print("Current tags:")
for tag in test.get_tags():
    print("  Tag:", tag)

# Add tags
test.add_tags(["sleepy", "happy"])

# Remove tags
test.remove_tags(["cute"])

# Set tags, removing all existing tags
test.set_tags(["dog", "good boy"])

# Save changes and close file
test.close()

# Re-open for tag editing
test.open()

# Remove all tags
test.clear_tags()

# Delete the ImgTag object, automatically saving and closing the file
del(test)

我还没有为其他 XMP 字段(如描述、日期、创建者等)添加方法。也许有一天我会,但如果你看看现有函数的工作方式 在源代码中,你可能可以自己添加方法。如果你添加了更多的方法,请提一个 pull 请求。 :)

您可以使用ImageMagic convert,据我所知,还有一个Python模块可以使用。





相关问题
热门标签