我可以用Python访问ImageMagick API吗?
我需要使用ImageMagick,因为PIL提供的图像功能不够我需要的多。不过,我想用Python来实现。
Python的绑定库(PythonMagick)自2009年就没有更新过。我找到的唯一方法就是用os.system
来调用命令行界面,但这感觉有点麻烦。
有没有办法直接通过ctypes
来访问API,并进行一些转换?如果没有的话,还有没有其他库可以提供像ImageMagick那样丰富的图像编辑工具呢?
3 个回答
我没有找到合适的Python库来使用ImageMagick,所以为了在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)作为输入。
我用下面这个命令成功地把字母"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)
我推荐使用Wand(后面会解释原因)。
我在寻找一个合适的方式来使用ImageMagick这个库,要求是:
- 没有错误或问题
- 定期维护并保持更新
- 能让Python代码看起来简洁明了
但是实际上,Python的API(接口)有太多不同的版本(大多数已经停止更新)。在看了Benjamin Schweizer写的一个很不错的历史概述后,我明白了很多事情:
- GraphicsMagick
- PythonMagick - 第一个实现
- PythonMagickWand/Achim Domma - 第一个Wand - 一个CDLL实现
- PythonMagickWand/Ian Stevens
- MagickFoo - 包含在python-magickwand中
- Wand/Hong Minhee - 不是最新的项目
- [更新 2023] Eric McConville https://github.com/emcconville/wand
现在,Wand只是一个简化的C语言API,用于ImageMagick。“.. API是C语言和ImageMagick图像处理库之间推荐的接口。与MagickCore C API不同,MagickWand只使用少量不透明类型。可以使用访问器来设置或获取重要的wand属性。”(查看项目主页)
所以它已经是一个简化的接口,更容易维护。
[更新 2023] PS 作为任何API软件,py-wand会继承父级的临时错误。