Python 快速从Pyglet中的图像获取alpha通道数据
我正在尝试使用Pyglet库获取一个具有sprite图像的alpha通道值的数组。 我写了这段代码,它实际上是有效的:Python 快速从Pyglet中的图像获取alpha通道数据,python,python-2.7,opengl,pyglet,Python,Python 2.7,Opengl,Pyglet,我正在尝试使用Pyglet库获取一个具有sprite图像的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]))
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
我不知道pyglet,但我猜性能问题与许多只针对单个像素的查询有关。相反,您希望在一次调用中从GPU获取整个图像,包括颜色和alpha值,然后仅提取alpha值。我还将使用而不是
ord()
注意:此代码未经测试,仅基于问题中的示例。也许有更好的办法
我认为这不值得,但如果你真的不想把颜色从GPU上拖回来,你可以先尝试将alpha复制到另一个纹理上(甚至可能有办法让GL将其解压为格式转换或重新解释)。非常感谢你为我指出了正确的方向,我在原始帖子中添加了正确的代码
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]