2012-01-11 28 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

相關問題