XMP图像标记和Python

5
如果我要通过Python为一堆图像打标签,最好的方法是什么?我曾经使用过Perl的Image::ExifTool,并且非常习惯它的可靠性。我的意思是,这个东西在数以万计的图像上从未出现过问题。
我发现了由欧洲空间局等大佬支持的这个,但它明显被标记为不稳定。
现在,假设我熟悉C++,直接在Python中使用Adobe XMP toolkit有多容易?由于我以前从未尝试过这样做,因此不确定自己会遇到什么问题。
更新:我尝试了一些现有的库,包括上述工具包,它们仍然相当不成熟并且存在明显的问题。我最终写了一个基于Perl的服务器,可以接受XML请求来读取和写入元数据,并使用经过实战检验的Image::EXIF。代码量实际上非常少,绝对比折磨自己尝试让Python库正常工作要好。服务器解决方案与语言无关,所以它是两全其美的选择。
5个回答

4

他们的网站上写道,python-xmp-toolkit使用基于Adobe XMP工具包的Exempi,通过ctypes实现。我的意思是说,你不太可能自己创建更好的C++代码封装。如果它不稳定(即有错误),那么创建补丁可能仍然比从头开始自己做要便宜。

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


没错,我绝对不想与欧洲航天局竞争 :) 但我想知道是否可以直接使用Adobe工具包快速完成。我的目的非常有限,只是编写一些简单的标记-没有花哨的东西。 - Andrei Taranchenko
在这种情况下,我会建议你编写一个简单的扩展模块。 - Torsten Marek
@Torsten 或者可以尝试使用 python-xmp-toolkit。"不稳定"这个词比较模糊,它很可能能够满足他的需求。唯一的方法就是尝试一下。 - Daniel Naab
如果您在 MAC 上构建 Exempi,则可能会遇到一些问题,因为可用的构建(macports、brew)均未安装 ctypes 所需的模块。 - Dan Osipov

4
我曾经花费数小时尝试使用python-xmp-toolkit,最终放弃并仅仅调用ExifTool
也有一个Ruby库可以包装ExifTool(比我创建的好得多);我认为将其移植到Python中以简单地处理XMP值得一试。

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

(文档中还有一个教程

GPL,不幸的是,对于大多数人来说,这个已经死了... - Glenn Maynard

1

如果未来有人查找此帖子,我想分享我的解决方案。 我在Python软件包索引(PyPI)上发布了一个名为imgtag的包。 它可以使用python-xmp-toolkit进行基本的XMP主题字段标记编辑,但将所有令人沮丧的无聊操作抽象成一行命令。

安装适用于您平台的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字段添加方法,比如描述、日期、创建者等。也许有一天我会添加,但如果你看看现有函数 在源代码中 如何工作,你可能可以自己添加这个方法。如果你确实添加了更多的方法,请发起拉取请求。 :)

0

你可以使用ImageMagic convert,如果我没记错的话,它也有一个Python模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接