【问题标题】:Segmentation Fault Django ImageMagick分割错误 Django ImageMagick
【发布时间】:2015-05-27 14:53:28
【问题描述】:

我正在使用 instagram 的 API 进行 Web 应用程序。本练习所需的要点之一是“在 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,分段错误。 ../sysdeps/unix/syscall-template.S:81 处的 kill () 中的 0x00007ffff782dfb7 81 ../sysdeps/unix/syscall-template.S:文件或目录没有 存在。

【问题讨论】:

    标签: python django imagemagick ctypes magickwand


    【解决方案1】:

    确保使用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")
    

    【讨论】:

    • 我添加了这些行,但它不起作用。它不会引发任何异常,但是当它尝试 MagickReadImage 崩溃时。
    • @Shaderlolz,见this answer。您传递或调用无效的 C 库引用。确定您将 char 缓冲区传递给 MagickReadImage 吗?
    猜你喜欢
    • 2012-01-06
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2012-06-29
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多