XMP图像标记和Python

时间:2009-02-01 16:28:14

标签: python xmp

如果我要通过XMP标记一堆图像,在Python中,最好的方法是什么?我使用过Perl的 Image :: ExifTool ,我非常习惯它的可靠性。我的意思是,数以万计的图像从未陷入困境。

我找到了this,得到了欧洲航天局等重量级人物的支持,但它显然标记为不稳定。

现在,假设我对C ++感到满意,那么在Python中直接使用Adobe XMP toolkit是多么容易?从来没有这样做过,我不确定我会注册什么。

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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

还有a Ruby library包裹了ExifTool(虽然比我创建的要好得多);我认为将它移植到Python以获得一种处理XMP的简单方法是值得的。

答案 2 :(得分:1)

对于Python 3.x,py3exiv2支持编辑XMP元数据

  

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

我喜欢py3exiv2的一件事是它建立在(C ++)exiv2 library上,看起来维护得很好

我在系统上安装时遇到了问题(Ubuntu 16.04)。为了使它工作,我首先必须安装最新版本的libexiv2-dev(structure(list(moderator_value = c(-1, 0, 1), simple_intercept = c(-0.0274552251655293, 0.0599069333124192, 0.147269091790368), simple_slope = c(0.276897278474258, 0.214782863579552, 0.152668448684846)), .Names = c("moderator_value", "simple_intercept", "simple_slope"), row.names = c(NA, 3L), class = "data.frame") ),并且只有在安装py3exiv2(x <- 1:7 y <- 4:10 largest_nr <- min(x, y) # to get a 1 in the first entry res_vec <- c() # empty vector # loop through the numbers and check if we have a new largest number for (i in 1:length(x)) { if (min(x[i], y[i]) >= largest_nr) { # new largest number found largest_nr <- max(x[i], y[i]) res_vec <- c(res_vec, 1) } else { # no new largest number found res_vec <- c(res_vec, 0) } } cbind(x, y, res_vec) #> x y res_vec #> [1,] 1 4 1 #> [2,] 2 5 0 #> [3,] 3 6 0 #> [4,] 4 7 1 #> [5,] 5 8 0 #> [6,] 6 9 0 #> [7,] 7 10 1 )之后

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

sudo apt-get install libexiv2-dev

(文档中还有tutorial

答案 3 :(得分:1)

对于将来找到此线程的人们,我想分享我的解决方案。 I put a package up on the Python Package Index (PyPI) called imgtag.它使您可以使用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字段添加方法,例如描述,日期,创建者等。也许有一天我会这样做,但是如果您查看现有功能的工作方式in the source code,则可能会发现如何自己添加方法。如果您确实添加了更多方法,请提出拉取请求。 :)

答案 4 :(得分:0)

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