快速从Pyglet中的图像获取Alpha通道数据

时间:2015-06-13 17:02:25

标签: python python-2.7 opengl pyglet

我正在尝试使用Pyglet库获取具有精灵图像的alpha通道值的数组。 我写了这段实际有用的代码:

mask = []
for x in range(image.width):
    mask.append([])
    for y in range(image.height):
        mask[x].append(ord(image.get_region(x, y, 1, 1).get_image_data().get_data("RGBA", 4)[3]))
return mask

唯一的问题是它真的很慢,我想我正在使用错误的函数来检索alpha通道。我该怎么做才能让它更快?

更新

我找到一个使用以下代码的解决方案,速度更快:

rawimage = image.get_image_data()
format = 'RGBA'
pitch = rawimage.width * len(format)
pixels = rawimage.get_data(format, pitch)

data = unpack("%iB" % (4 * image.width * image.height), pixels)
mask = data[3::4]
return mask

1 个答案:

答案 0 :(得分:1)

我不了解pyglet,但我猜测性能问题与只有一个像素的许多查询有关。相反,您只想在一次调用中从GPU获取整个图像,包括颜色和alpha值,然后只提取alpha。我还使用struct.unpack代替ord()

注意:此代码未经测试,纯粹基于问题中的示例。可能有更好的方法。

from struct import unpack
...
region = image.get_region(0, 0, image.width, image.height)
packed_data = region.get_image_data().get_data("RGBA", 4)
data = unpack("%iB" % (4 * image.width * image.height), packed_data)
mask = data[3::4]

我认为它不值得,但如果你真的不想从GPU中拖回颜色,你可以先探索将alpha复制到另一个纹理(甚至可能是让GL将其解压缩为格式转换或重新解释的方法。