5

如果我要在 Python 中通过 XMP 标记一堆图像,最好的方法是什么?我使用过 Perl 的Image::ExifTool,我非常习惯它的可靠性。我的意思是这个东西从来没有在成千上万的图像上变砖。

我发现了这一点,得到了欧洲航天局等重量级机构的支持,但它被明确标记为不稳定。

现在,假设我对 C++ 很熟悉,那么在 Python 中直接使用Adob​​e XMP 工具包有多容易?以前从未这样做过,我不确定我会注册什么。

更新:我尝试了一些库,包括前面提到的工具包,它们仍然很不成熟并且有明显的问题。我求助于实际编写了一个基于 Perl 的服务器,该服务器接受 XML 请求以读取和写入元数据,并使用经过实战测试的 Image::EXIF。代码量实际上非常少,绝对比通过尝试让 Python 库工作来折磨自己要好。服务器解决方案与语言无关,所以它是一个双重的。

4

5 回答 5

4

好吧,他们的网站说 python-xmp-toolkit 通过 ctypes 使用基于 Adob​​e XMP 工具包的 Exempi。我想说的是,您不太可能自己创建更好的 C++ 代码包装。如果它不稳定(即有缺陷),那么创建补丁很可能比自己从头开始更便宜。

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

于 2009-02-01T16:44:56.247 回答
4

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

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

于 2010-09-13T07:52:36.263 回答
2

对于 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()

(文档中也有教程

于 2017-08-05T16:58:22.930 回答
1

对于将来找到此线程的人,我想分享我的解决方案。我在 Python 包索引 (PyPI) 上放了一个名为imgtag. 它允许您使用 进行基本的 XMP 主题字段标签编辑python-xmp-toolkit,但将实际使用的所有令人沮丧的废话抽象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 字段(如描述、日期、创建者等)添加方法。也许有一天我会这样做,但是如果您查看源代码中现有函数的工作方式,您可能会弄清楚如何添加自己方法。如果您确实添加了更多方法,请提出拉取请求。:)

于 2020-10-01T22:30:52.330 回答
0

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

于 2009-02-04T04:21:00.897 回答