将图像从C++传递到Python 3.4

4 投票
1 回答
1789 浏览
提问于 2025-04-18 11:14

我在一个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()来处理。

撰写回答