2010-05-29 45 views
5

我有代码,需要一个PIL图像并将其转换为一个ctypes阵列传递出一个C函数:有效地转换字符串(或元组)到ctypes的阵列

w_px, h_px = img.size 
pixels = struct.unpack('%dI'%(w_px*h_px), img.convert('RGBA').tostring()) 
pixels_array = (ctypes.c_int * len(pixels))(*pixels) 

但是我处理与大的图像,并解开许多项目成函数参数似乎是明显缓慢。为了获得合理的加速,我可以做的最简单的事情是什么?

我只是转换为一个元组作为中间步骤,所以如果没有必要,所有更好。

+0

有还有'(ctypes.c_int * n).from_buffer',你可以使用字符串。我仍然试图找到如何使用它,而不需要立即将PIL'Image'转换为字符串。 – Kos 2012-12-12 10:20:26

回答

7

您可以先建立一个未初始化数组:

pixarray = (ctypes.c_int * (w_px * h_px))() 

,然后将图像的内容复制到其中:

# dylib in MacOSX, cdll.wincrt in Win, libc.so.? in Unix, ... 
clib = ctypes.CDLL('libc.dylib') 

_ = clib.memcpy(pixarray, im.tostring(), w_px * h_px * 4) 

的memcpy的返回值是你不关心的地址,所以我通过将其分配给“单下划线”(按照惯例意思是“我不在乎这个”)来“吞噬”它;-)。

编辑:如@Mu心灵在评论中指出,后者的片段可以有效简化使用ctypes.memmove而不需要去平台相关揪出clib:只是做

_ = ctypes.memmove(pixarray, im.tostring(), w_px * h_px * 4) 
+3

看起来像ctypes.memmove以平台无关的方式做同样的事情:ctypes.memmove(pixarray,im.tostring(),w_px * h_px * 4) – 2010-05-29 16:39:59

+0

@Mu,优秀,+1和谢谢!让我相应地编辑答案。 – 2010-05-29 16:42:38

+0

糟糕,看起来像输出有字节序问题。有什么建议么? – 2010-05-30 13:07:22

相关问题