我有一些代码,它采用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)

  ask by Mu Mind translate from so

未解决问题?本站智能推荐:

2回复

使用ctypes数组时,PIL的Image.frombuffer预期数据长度

我正在使用Python,PIL和ctypes来进行图像处理。 当我把东西fromstring在一起时,我使用PIL的fromstring函数将像素缓冲区从ctypes转换为PIL对象。 我只是迭代数组,构建python字符串。 这有效 它不漂亮,但它奏效了。 与TODO评论并继续前
1回复

使用PIL.Image和ctypes进行像素操作

我有一个C函数,它对8位RGB值的原始2D数组进行一些像素处理。 我在c_ubyte数组中得到响应。 我的代码看起来大致如下: 此时我想使用PIL将图像写入文件。 我目前使用以下代码将字节数据转换为图像数据: 这有效,但对我来说效率非常低。 在2.2GHz Core i7上,59
2回复

在Python中将字符串转换为ctypes.c_ubyte数组的有效方法

我有一个20字节的字符串,我想将它转换为ctypes.c_ubyte数组用于位字段操作。 有没有办法避免为了演员而从str到bytearray的深拷贝? 或者,是否可以在没有深层复制的情况下将字符串转换为bytearray? (使用memoryview等技术?) 我使用的是Pyth
1回复

尽快将ctypes数据转换为python字符串

我正在尝试在PyQt4中编写一个视频应用程序,我使用Python ctypes挂钩到一个旧的传统视频解码器库。 该库为我提供了32位ARGB数据,我需要将其转换为QImage。 我的工作方式如下: 问题是ctypes将数据输出为类型“ ctypes.c_char_Array_829440
1回复

将多维numpy数组转换为ctypes数组的最有效方法

您好,我正在python中使用ctypes模块从python运行一些图像处理C代码,以优化我的代码,并减少执行时间。 为此,我将图像读取到一个numpy数组中,然后使用内核将2D卷积应用于该图像,从而生成过滤后的图像。 我想要在C中达到相同的效果,以节省一些执行时间。 因此,问题的第一
3回复

ctypes和字符串

我有一个简单的C文件: 和python文件: 如何在python中获得“test”字符串?
1回复

Python-将字符串对象转换为ctypes(无符号char*)

我想将DLL文件与具有以下签名的函数一起使用- 现在,buff必须由我到达与python包装器等效的字符串产生 由于pyBuff很大(主要是),所以我不想分配新的c uchar数组并进行复制,而是要利用原始缓冲区。 基本上,获取pyBuff对象的char缓冲区并将其作为ctypes(c
1回复

是否可以使用ctypes有效地将字节和字节数组对象传递给外部库?

假设我在外部库中具有以下功能: 我希望能够使用ctypes从我的Python代码中调用此函数,而无需复制缓冲区。 缓冲区可能很大,因此避免复制会带来明显的性能优势。 为了方便我的代码使用者,我希望能够以bytes或bytearray提供此缓冲区。 目前,我在argtypes声明cty