将图像从C++传递到Python 3.4
我在一个C++程序里嵌入了Python解释器,用来生成报告。在报告中,Python脚本会从C++程序获取图像数据,然后用这些数据创建一个PIL
图像,具体代码如下:
width = getImageWidth ()
height = getImageHeight ()
pixels = getImagePixels ()
pilTile = Image.frombuffer ('RGB',
(width, height),
pixels,
'raw',
'RGB',
0,
-1)
在C++这边,我通过Boost.Python
把图像像素作为一个缓冲区返回:
object getImagePixels ()
{
GLubyte *buf = getImage () ;
size_t size = getSize () ;
object obj = object ((handle<>(borrowed (PyBuffer_FromMemory (
(char *) buf, size, PyBUF_READ))))) ;
return obj ;
}
不过问题来了,Python 3.x去掉了PyBuffer_FromMemory
这个接口。我尝试用PyMemoryView_FromMemory
来替代,但PIL
似乎无法使用内存视图。
那么,替换PyBuffer_FromMemory
的最佳方法是什么呢?
谢谢你的帮助!
1 个回答
0
这有点绕,但如果你有numpy这个库,你可以这样做:
#include <numpy/arrayobject.h>
...
PyObject* pyArray = PyArray_SimpleNewFromData(1, size, NPY_BYTE, (void*)buf));
(文档链接)
我对Boost.Python的工作原理不是特别了解,不过看了一下文档,handle
可以用来保存任何从PyObject
派生的东西,所以应该是可以用的。
你也可以直接返回numpy数组,然后使用Image.fromarray()
来处理。