我可以用Python访问ImageMagick API吗?

2024-05-19 00:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要使用ImageMagick,因为PIL没有足够的可用图像功能。但是,我想使用Python。

python绑定(PythonMagick)自2009年以来就没有更新过。我唯一能找到的是使用命令行接口的os.system调用,但这看起来很笨拙。

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


Tags: 工具方法命令行图像功能apipil图书馆
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 image作为stdout流。以类似的方式,通过指定-作为输入文件名,您可以告诉它使用stdin流作为输入。

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

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

  • 工作错误/无问题
  • 定期维护和更新
  • 允许nice objective Python

但实际上,python API(绑定)有太多不同的(大多已停止)版本。在阅读了本杰明·施韦泽(Benjamin Schweizer)的一篇精彩的历史综述之后,一切都变得清晰起来(另见他的github wiki):

  • 图形绘图
  • PythonMagick-第一个实现
  • PythonMagickWand/Achim Domma-第一个Wand-一个CDLL实现
  • PythonMagickWand/伊恩•史蒂文斯
  • MagickFoo-包含在python magickwand中
  • 旺德/洪敏熙-最新项目

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

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

下面的命令可以根据字母“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)

相关问题 更多 >

    热门问题