有效地将字符串(或元组)转换为ctypes数组

时间:2010-05-29 15:27:23

标签: python python-imaging-library ctypes

我有代码接受PIL图像并将其转换为ctypes数组以传递给C函数:

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)

但是我正在处理大图像,并且将许多项目解压缩到函数参数中似乎显然很慢。为了获得合理的加速,我能做的最简单的事情是什么?

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

1 个答案:

答案 0 :(得分: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 Mind在评论中指出的那样,后一个片段可以有效地简化为使用ctypes.memmove,而无需依赖于平台来寻找{{1只是做

clib