分段错误Django ImageMagick

时间:2015-05-27 14:53:29

标签: python django imagemagick ctypes magickwand

使用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,分段故障。   kill()中的0x00007ffff782dfb7位于../sysdeps/unix/syscall-template.S:81   81 ../sysdeps/unix/syscall-template.S:文件或目录没有   存在。

1 个答案:

答案 0 :(得分: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")