有效地转换字符串(或元组)到ctypes的阵列
我有代码,需要一个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)
但是我处理与大的图像,并解开许多项目成函数参数似乎是明显缓慢。为了获得合理的加速,我可以做的最简单的事情是什么?
我只是转换为一个元组作为中间步骤,所以如果没有必要,所有更好。
您可以先建立一个未初始化数组:
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)
看起来像ctypes.memmove以平台无关的方式做同样的事情:ctypes.memmove(pixarray,im.tostring(),w_px * h_px * 4) – 2010-05-29 16:39:59
@Mu,优秀,+1和谢谢!让我相应地编辑答案。 – 2010-05-29 16:42:38
糟糕,看起来像输出有字节序问题。有什么建议么? – 2010-05-30 13:07:22
有还有'(ctypes.c_int * n).from_buffer',你可以使用字符串。我仍然试图找到如何使用它,而不需要立即将PIL'Image'转换为字符串。 – Kos 2012-12-12 10:20:26