在 python 字节数组中创建灰度图像

问题描述

我需要将灰度图像作为二进制数组传递给 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 不会修改像素数据)。