我正在尝试使用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
答案 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将其解压缩为格式转换或重新解释的方法。