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

5 投票
1 回答
2486 浏览
提问于 2025-04-15 23:19

我有一段代码,它可以把一个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 个回答

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,这样就不需要去找平台相关的clib了:只需这样做

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

撰写回答