1

我正在使用 instagram 的 API 做一个网络应用程序。本练习所需的要点之一是“在 python 代码中使用 C 库”,因此我使用 CTYPES 来调整 ImageMagick 以将过滤器应用于照片。

所以,我有 URL 图像,我想应用过滤器:

from ctypes import * 
    factor = 2
    libwand=CDLL("libMagick++.so.5")
    libwand.MagickWandGenesis()
    magick_wand = libwand.NewMagickWand()
    #url_image is a simple url like http://www.images.com/123.jpg
    libwand.MagickReadImage(magick_wand,url_image)
    libwand.MagickBlueShiftImage(magick_wand,factor);
    libwand.MagickWriteImage(magick_wand,'./login/static/images/imagenNueva.jpg');

如果我在一个简单的 tets.py 中执行此操作,它可以正常工作,但是一旦我将它放入 django 的 views.py 中,它就会产生分段错误。

这是 gdb 输出:

程序收到信号 SIGSEGV,分段错误。0x00007ffff782dfb7 in kill () at ../sysdeps/unix/syscall-template.S:81 81 ../sysdeps/unix/syscall-template.S: 文件或目录不存在。

4

1 回答 1

0

确保加载了正确的库ctypes.CDLL。对于您执行的命令,我相信您想要libwand=CDLL("libMagickWand.so"). 发现正确库名称的最佳方法是使用该MagickWand-config实用程序在系统上找到正确的库名称。

此外,对于每个 ctypes 方法调用,您需要指定函数签名

# Tell ctypes that the return value is a pointer
libwand.NewMagickWand.restype = c_void_p
libwand.MagickReadImage.argtypes = [c_void_p,      # MagickWand *
                                    c_char_p]      # char *
libwand.MagickBlueShiftImage.argtypes = [c_void_p, # MagickWand *
                                         c_double] # double

如果不将 C-API 映射到 python,则会导致错误,因为 python 会假设一切都是整数。

当然,错误/异常处理

magick_wand = libwand.NewMagickWand()
if magick_wand is None:
    raise MyException("Couldn't allocate memory")
ok = libwand.MagickReadImage(magick_wand,url_image)
if not ok:
    raise MyException("Couldn't read image")
于 2015-05-27T18:22:41.307 回答