使用pyglets .save()
函数时出现了一个奇怪的现象
当我将其从代码中删除时,应用程序的输出如下所示:
黑色区域是主窗口对象,灰色区域是graph()
类,绿色线是图形像素数据的修改数据,因此绿色线不是叠加或单独的对象,它是pixeldata本身。
一旦我添加self.texture.save()
(灰色+绿色像素数据),屏幕变黑(就好像self.texture
在我身上完全支持alpha或者像素数据消失了)和{{1} }(example code for saving images)文件看起来像:
(如果您认为我在拖钓,那么它是空白/透明的......)
kitten.png
答案 0 :(得分:1)
我知道这是一篇旧帖子,但我是通过谷歌搜索找到的,所以我希望这个答案可以帮助其他人寻找类似的东西。
我已经对代码进行了攻击,这就是我的想法:
import pyglet
def YXColorMap(data, width, format_length):
YX = [data[i:i+format_length] for i in range(0, len(data), format_length)]
return [YX[i:i+width] for i in range(0, len(YX), width)]
def MapToString(colour_map):
YX = [item for row in colour_map for item in row]
return bytes([b for item in YX for b in item])
class Graph(pyglet.sprite.Sprite):
def __init__(self, color="#C2C2C2", width=640, height=480, x=0, y=0, plotpoints=[], maxx=None, maYX=None):
texture = self.gen_solid_img(width, height, color)
tmp = texture.get_image_data()
data = tmp.get_data('RGBA', tmp.width * 4)
colour_map = YXColorMap(data, tmp.width, 4)
for yP, xP, color in plotpoints:
colour_map[yP][xP] = color
tmp.set_data('RGBA', tmp.width * 4, MapToString(colour_map))
super().__init__(texture)
self.x = x
self.y = y
def save_image(self, fileName):
self._texture.save(fileName)
def gen_solid_img(self, width, height, c):
if type(c) == str:
c = c.lstrip("#")
c = max(6-len(c),0)*"0" + c
r = int(c[:2], 16)
g = int(c[2:4], 16)
b = int(c[4:], 16)
a = int(0.2 * 255)
elif type(c) == tuple:
r, g, b, a = c
c = (r,g,b,a)
return pyglet.image.SolidColorImagePattern(c).create_image(width, height)
if __name__ == '__main__':
plotpoints = [(x+2, x, (0, 0, 255, 255)) for x in range(0, 360)]
window = pyglet.window.Window()
graph = Graph(plotpoints=plotpoints)
def on_draw():
graph.draw()
window.on_draw = on_draw
graph.save_image('kitten.png')
pyglet.app.run()
它应打开一个蓝色斜线的窗口,并将图形保存到名为kitten.png
我认为问题中代码的问题可能是self.texture
和self._texture
之间的混淆,其中self.texture
是由Graph类指定的变量,{{1}是精灵的纹理。