2012-01-11 72 views
1

我正在使用carrays.i中定义的SWIG array_class宏来创建一个可以发送到我的项目的C++端的unsigned char缓冲区,该缓冲区处理拍照。这工作正常 - 缓冲区是在相机触发后填充宽度数据,我可以使用python中的[]来解引用缓冲区,以查看它保存的内容。我现在想从该缓冲区创建PIL图像,使用Image.frombuffer将SWIG代理对象作为输入传递给PIL.Image.frombuffer

Image.frombuffer(mode, size, data) => image 

(新中PIL 1.1.4)。使用标准的“原始”解码器,从字符串或缓冲区对象中的像素数据创建图像内存。

,但我得到一个错误信息,告诉我,我提供痛饮对象不是蟒蛇缓冲:

File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1853, in frombuffer
core.map_buffer(data, size, decoder_name, None, 0, args)
TypeError: expected string or buffer

我怎样才能用缓冲的类型兼容痛饮对象的这种代理是Image.frombuffer预期?

+1

我不确定它是否应该使用缓冲区(可能它应该)。我只是想指出,我喜欢通过NumPy数组桥接所有图像数据。国际海事组织(IMO)更容易直接从C++操纵NumPy Python对象,而不是试图让SWIG生成正确的代码。我有一些[示例代码](https://github.com/martinxyz/python/blob/master/realistic/hello.hpp)在线。你可以让SWIG包装一个返回PyObject *的方法,并返回一个由PyArray_SimpleNew()创建的新的NumPy对象。 – maxy 2012-01-11 20:29:24

+1

你是否知道某处的车道长度? – Flexo 2012-01-13 00:15:53

回答

0

如果您可以处理强制SWIG缓冲区的签名,则可以直接创建PIL ImagingMemoryInstance。在libImaging/Imaging.h你会发现这一点:

struct ImagingMemoryInstance { 

    /* Format */ 
    char mode[4+1]; /* Band names ("1", "L", "P", "RGB", "RGBA", "CMYK") */ 
    int type;  /* Data type (IMAGING_TYPE_*) */ 
    int depth;  /* Depth (ignored in this version) */ 
    int bands;  /* Number of bands (1, 2, 3, or 4) */ 
    int xsize;  /* Image dimension. */ 
    int ysize; 

    /* Colour palette (for "P" images only) */ 
    ImagingPalette palette; 

    /* Data pointers */ 
    UINT8 **image8; /* Set for 8-bit images (pixelsize=1). */ 
    INT32 **image32; /* Set for 32-bit images (pixelsize=4). */ 

    /* Internals */ 
    char **image; /* Actual raster data. */ 
    char *block; /* Set if data is allocated in a single block. */ 

    int pixelsize; /* Size of a pixel, in bytes (1, 2 or 4) */ 
    int linesize; /* Size of a line, in bytes (xsize * pixelsize) */ 

    /* Virtual methods */ 
    void (*destroy)(Imaging im); 
}; 

... ImagingMemoryInstance *的typedef定义到Imaging,这是基本结构,你会在整个PIL C扩展源普遍发现。 Don't take my word for it, have a look - 就API来说,PIL代码库显着清晰且相当一致。

正如@maxy所指出的,你也可以像创建一个NumPy数组结构一样简单(虽然不那么容易) - 但是当NumPy C API和Guido的个人剧本一样稳定时,我个人发现一个库在这些情况下,资源依赖就足够了。

+0

另外:这不是一个SWIG代理,而是:检查这个人设置的与PIL往来的缓冲区:https://bitbucket.org/ynil/pyccv/src/d201d144e8e9/src/pyccv/__init__ .py ... RGBImage python类实际上是一个C结构,其字节布局类似于NumPy数组等效的dtype。我不知道像老板那样的ctypes,但是如果我遇到了你的问题,我会玩这种类似的东西。 – fish2000 2012-03-15 14:04:31

相关问题