如果我要通过XMP标记一堆图像,在Python中,最好的方法是什么?我使用过Perl的 Image :: ExifTool ,我非常习惯它的可靠性。我的意思是,数以万计的图像从未陷入困境。
我找到了this,得到了欧洲航天局等重量级人物的支持,但它显然标记为不稳定。
现在,假设我对C ++感到满意,那么在Python中直接使用Adobe XMP toolkit是多么容易?从来没有这样做过,我不确定我会注册什么。
更新:我尝试了一些库,包括前面提到的工具包,它们仍然非常不成熟并且有明显的问题。我实际上编写了一个基于Perl的服务器,它接受读取和写入元数据的XML请求,使用经过实战考验的Image :: EXIF。代码量实际上非常轻,并且通过尝试使Python库工作,肯定会折磨自己。服务器解决方案与语言无关,因此它是双重的。
答案 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模块。