Pyglets image.save('file.png')不保存对img-data的修改

时间:2014-02-25 14:43:33

标签: python image-processing python-3.x pyglet

使用pyglets .save()函数时出现了一个奇怪的现象 当我将其从代码中删除时,应用程序的输出如下所示:
enter image description here
黑色区域是主窗口对象,灰色区域是graph()类,绿色线是图形像素数据的修改数据,因此绿色线不是叠加或单独的对象,它是pixeldata本身。

一旦我添加self.texture.save()(灰色+绿色像素数据),屏幕变黑(就好像self.texture在我身上完全支持alpha或者像素数据消失了)和{{1} }(example code for saving images)文件看起来像:
enter image description here

(如果您认为我在拖钓,那么它是空白/透明的......)

kitten.png

1 个答案:

答案 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.textureself._texture之间的混淆,其中self.texture是由Graph类指定的变量,{{1}是精灵的纹理。