问题描述
我需要将灰度图像作为二进制数组传递给 python 中的 DLL。我正在使用 PIL 加载原始图像,将其转换为灰度,然后将像素复制到 c_char 数组。我的代码如下所示:
from ctypes import *
from PIL import Image
grayScale = Image.open(fileName).convert('L')
pixelMap = grayScale.load() #create the pixel map
pixel_array = c_char * (grayScale.height * grayScale.width)
pixels = pixel_array()
for y in range(grayScale.height):
i = y * grayScale.width
for x in range(grayScale.width):
pixels[i+x] = pixelMap[x,y]
'pixels' 然后作为 c_char_p 参数传递给需要它的 DLL。
这有效,但即使是中等大小的图像也很慢。不熟悉 PIL(或 Python),有没有比逐个像素更有效地访问灰度数据的方法?
解决方法
经过更多挖掘,我找到了解决方案:
db.collection.aggregate([
{
$group: {
_id: null,root: { $mergeObjects: "$$ROOT" }
}
},{ $replaceRoot: { newRoot: "$root" } }
])
.tobytes() 函数返回一个 Bytes 对象,该对象与 c_char 兼容(当作为参数传递给 DLL 时,使用指针,或 c_char_p,它与 Bytes 对象一起使用)。
请注意,这是一个不可变类型,对于我的用例来说很好(DLL 不会修改像素数据)。