我可以用Python访问ImageMagick API吗?

我需要使用ImageMagick作为PIL没有我正在寻找的图像function的数量。 不过,我想用Python。

Python绑定(PythonMagick)自2009年以来一直没有更新。我唯一能够find的是使用命令行界面的os.system调用,但这看起来很笨重。

有没有什么办法直接使用ctypes和某种types的转换来访问API? 作为最后的手段,那里有其他的图书馆有像ImageMagick这样的大量图像编辑工具,我已经看过了?

我会build议使用魔杖 (解释如下)。

我正在寻找适当的绑定ImageMagick库,这将:

  • 工作错误/无问题
  • 定期维护并保持最新状态
  • 允许很好的目标Python

但确实python API(绑定)有太多的不同(大多数是停产)的版本。 在阅读Benjamin Schweizer的一篇不错的历史概述之后,这一切都变得清晰了(也见他的github wiki )

  • GraphicsMagick工具
  • PythonMagick – 第一个实现
  • PythonMagickWand / Achim Domma – 第一个魔杖 – 一个CDLL实现
  • PythonMagickWand / Ian Stevens
  • MagickFoo – 包含在python-magickwand中
  • 魔杖/洪敏熙 – 最新的项目

现在魔杖只是ImageMagick的(简化)C API“.. API是C编程语言和ImageMagickimage processing库之间的推荐接口,与MagickCore C API不同,MagickWand只使用了一些不透明的types。设置或获得重要的魔杖属性“。 ( 见项目主页 )

所以它已经是一个简化的界面,更容易维护。

我发现ImageMagick没有好的Python绑定,所以为了在Python程序中使用ImageMagick,我不得不使用subprocess模块来redirectinput/输出。

例如,我们假设我们需要将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图像作为stdoutstream。 以类似的方式,您可以通过指定-作为input文件名告诉它使用标准inputstream作为input。

这对我来说可以用下面的命令为文字“P”创build一个图像:

 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)