我希望能够使用PythonMagick生成蒙太奇。文档似乎非常稀疏,但我一直在尝试使用Eclipse的代码完成部分来查找它,以及其他一些关于Stack Overflow的其他问题的建议。看来MagickWand API具有我正在寻找的功能,根据这个:
http://www.imagemagick.org/api/MagickWand/montage_8c.html
但是,我似乎无法在PythonMagick中找到它。这根本不可用吗?如果是这样的话,我可能会放弃我的其余PythonMagick代码并依赖于可移植的ImageMagick发行版上的subprocess.call(此程序必须是可移植的,并且在Windows上运行,并且具有到Mac OS的简单端口...到目前为止,我还有一些其他的PythonMagick命令正在工作,所以如果可能的话,我想保持这条路线。)
谢谢!
答案 0 :(得分:1)
使用python imagemagick / graphicsmagick绑定有很多帮助,但遗憾的是并非所有功能都存在。我实际上和@FizxMike有同样的问题。我需要使用蒙太奇,然后进行一些进一步的操作,但是将文件保存在硬盘上,然后在适当的pgmagick对象中重新加载以便执行其余的操作并再次保存它很慢。
最终我使用了子进程解决方案,但是我没有保存在文件中,而是将输出重定向到stdout。然后,我使用stdout从pgmagick.Blob加载pgmagick.Blob中的图像,并在python代码中完成剩余的处理。
程序在代码中如下所示:
import os
import pgmagick
import subprocess
my_files = []
# Dir with the images that you want to operate on
dir_with_images = "."
for file in os.listdir(dir_with_images):
if file.endswith(".png"):
my_files.append(os.path.join(dir_with_images, file))
montage_cmd = ['gm', 'montage']
montage_cmd.extend(my_files)
# The trick is in the next line of code. Instead of saving in a file, e.g. myimage.png
# the montaged file will just be "printed" in the stdout with 'png:-'
montage_cmd.extend(['-tile', '2x2', '-background', 'none', '-geometry', '+0+0', 'png:-'])
# Use the command line 'gm montage' since there are not python bindings for it :(
p = subprocess.Popen(montage_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# Get the stdout in a variable
stdout, stderr = p.communicate()
# Load the stdout in a python pgmagick Image object using the pgmagick.Blob
# and do the rest of the editing on python code
img = pgmagick.Image(pgmagick.Blob(stdout))
# Display the image
img.display()
geometry = pgmagick.Geometry(300, 200)
geometry.aspect(True)
# Resize the montaged image to 300x200, but keep the aspect ratio
img.scale(geometry)
# Display it again
img.display()
# And finally save it <- Only once disk access at this point.
img.write('myimage.png')
答案 1 :(得分:0)
我遇到同样的问题,即使pgmagick缺少所需的montageImage()函数(Magick++ montage example)
这就是我所做的(在Django View中):
#ImageMagick CLI is better documented anyway (-background none preserves transparency)
subprocess.call("montage -border 0 -geometry "+str(cols)+"x -tile 1x"+str(len(pages))+" "+target_path[0:len(target_path)-4]+"[0-9]*.png -background none "+target_path,shell=True)`
不好玩,因为我必须先处理一堆文件...写入硬盘不是最快的事情,然后删除临时文件。
我宁愿在公羊里做这一切。
我自己仍然在寻找更好的答案。