Python 从C库提供的内存流创建PIL映像

Python 从C库提供的内存流创建PIL映像,python,Python,我有一个指向由c库提供的png数据的char指针。 如何从内存中的数据在python中创建图像。 c函数如下所示: char *getImage(int *imgSize); 在Python中,我得到了char*,如下所示: imSize = c_int() img = c_char_p() img = c_char_p(my_c_api.getImage(byref(imSize))) char*返回到img变量中,图像的大小(以字节为单位)返回到imSize变量中 执行以下python脚

我有一个指向由
c
库提供的png数据的char指针。 如何从内存中的数据在python中创建图像。
c
函数如下所示:

char *getImage(int *imgSize);
在Python中,我得到了char*,如下所示:

imSize = c_int()
img = c_char_p()
img = c_char_p(my_c_api.getImage(byref(imSize)))
char*
返回到img变量中,图像的大小(以字节为单位)返回到
imSize
变量中

执行以下python脚本时:

im = Image.frombuffer("RGBA", (400,400),  img.value, 'raw', "RGBA", 0, 1)
我得到一个
ValueError:缓冲区不够大
错误。 我怀疑
frombuffer
调用中有img变量。
要将图像数据正确地传递给
frombuffer
调用,我必须如何处理img变量

您需要将数据放在
StringIO
实例中,并让PIL解析其中的数据

from cStringIO import StringIO

imgfile = StringIO(img.value)
im = Image.open(imgfile)

.frombuffer
采用原始图像数据,而非PNG编码数据。
StringIO
对象提供了一个类似文件的对象来包装数据,因此PIL可以使用它。

使用上述方法,我得到以下错误:raise IOError(“无法识别图像文件”)。图像缓冲区的长度为13984字节。当执行len(img.value)时,答案是8字节,看起来并不是所有13984字节都用StringIO(img.value)命令放在imgfile中,因此IOError(“无法识别图像文件”)请帮助,我需要从c api返回的数据缓冲区中创建python中的png图像。抱歉,我不知道你的c api是如何工作的;在将整个缓冲区传递到StringIO实例之前,首先将其作为字符串获取。此外,标识将使用文件中的第一组字节,最后缺少的字节我希望给出不同的错误(但我不确定)。