我可以使用Python访问ImageMagick API吗?

时间:2011-10-25 20:12:33

标签: python imagemagick image-manipulation ctypes

我需要使用ImageMagick,因为PIL没有我正在寻找的图像功能。但是,我想使用Python。

自2009年以来,python绑定(PythonMagick)尚未更新。我唯一能找到的是os.system调用使用命令行界面,但这看起来很笨拙。

有没有办法直接使用ctypes和某种转换来访问API? 作为最后的手段,还有其他任何图书馆都有大量的ImageMagick图像编辑工具供我查看吗?

3 个答案:

答案 0 :(得分:62)

我建议使用Wand(解释如下)。

我正在寻找与ImageMagick库的正确绑定,即:

  • 工作错误/无问题
  • 定期维护和更新
  • 允许很好的客观Python

但实际上python API(绑定)有太多不同的(大多数已停产)版本。在阅读了Benjamin Schweizer的精彩历史概述之后,它已经变得清晰(也见他的github wiki

  • GraphicsMagick工具
  • PythonMagick - 第一次实现
  • PythonMagickWand / Achim Domma - 第一个魔杖 - 一个CDLL实现
  • PythonMagickWand / Ian Stevens
  • MagickFoo - 包含在python-magickwand中
  • Wand / Hong Minhee - 最新项目

现在Wand只是ImageMagick的一个(简化的)C API“.. API是C编程语言和ImageMagick图像处理库之间的推荐接口。与MagickCore C API不同,MagickWand只使用几种不透明类型。存取器可用于设置或获取重要的魔杖属性。“ (See project homepage

因此,它已经是一个易于维护的简化界面。

答案 1 :(得分:3)

我发现ImageMagick没有很好的Python绑定,所以为了在Python程序中使用ImageMagick,我必须使用subprocess模块来重定向输入/输出。

例如,我们假设我们需要将PDF文件转换为TIF:

path = "/path/to/some.pdf"
cmd = ["convert", "-monochrome", "-compress", "lzw", path, "tif:-"]
fconvert = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = fconvert.communicate()
assert fconvert.returncode == 0, stderr

# now stdout is TIF image. let's load it with OpenCV
filebytes = numpy.asarray(bytearray(stdout), dtype=numpy.uint8)
image = cv2.imdecode(filebytes, cv2.IMREAD_GRAYSCALE)

在这里,我使用tif:-告诉ImageMagick的命令行实用程序,我想将TIF图像作为stdout流。以类似的方式,您可以通过将-指定为输入文件名来告诉它使用stdin流作为输入。

答案 2 :(得分:0)

这对我来说有用,可以使用以下命令从文本中为字母“P”创建图像:

import subprocess

cmd = '/usr/local/bin/convert -size 30x40 xc:white -fill white -fill black -font Arial -pointsize 40 -gravity South -draw "text 0,0 \'P\'" /Users/fred/desktop/draw_text2.gif'

subprocess.call(cmd, shell=True)