【问题标题】:Creating a grayscale image in a python byte array在 python 字节数组中创建灰度图像
【发布时间】:2021-06-24 21:23:45
【问题描述】:

我需要将灰度图像作为二进制数组传递给 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),有没有比逐个像素更有效的方法来访问灰度数据?

【问题讨论】:

  • 您为什么要删除所有显示您正在使用的模块的import 语句?为什么不分享你的图片? c_char的定义在哪里?谢谢。
  • 这只是一个更大的程序的sn-p;我已经包含了相关的导入(c_char 来自 ctypes,旧版 DLL 的接口类型)。实际图像没有实际意义(打开图像并生成像素图就可以了)——我正在寻找一种更有效的方法来访问像素数据以将其复制到 c_char 数组中——我必须使用该类型来传递图像数据 DLL。

标签: python python-imaging-library imaging


【解决方案1】:

经过一番挖掘,我找到了解决方案:

from ctypes import *
from PIL import Image

grayScale = Image.open(fileName).convert('L')
pixels = grayScale.tobytes()

.tobytes() 函数返回一个 Bytes 对象,它与 c_char 兼容(当作为参数传递给 DLL 时,使用指针,或 c_char_p,它与 Bytes 对象一起使用)。

请注意,这是一个不可变类型,对我的用例来说很好(DLL 不会修改像素数据)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多