我正在创建一个程序,它必须改变pyglet窗口中各个像素的颜色。我无法在文档中找到任何方法。有没有办法做到这一点?
答案 0 :(得分:2)
您可以使用魔术函数SolidColorImagePattern
并修改所需的数据。
R,G,B,A = 255,255,255,255
pyglet.image.SolidColorImagePattern((R,G,B,A).create_image(width,height)
这是.blit()
:能够成像的图像。它是白色的,可能不是你想要的
因此,我们会做更多的魔法并将所有像素替换为随机像素(蚂蚁之战):
import pyglet
from random import randint
width, height = 500, 500
window = pyglet.window.Window(width=width, height=height)
image = pyglet.image.SolidColorImagePattern((255,255,255,255)).create_image(width, height)
data = image.get_image_data().get_data('RGB', width*3)
new_image = b''
for i in range(0, len(data), 3):
pixel = bytes([randint(0,255)]) + bytes([randint(0,255)]) + bytes([randint(0,255)])
new_image += pixel
image.set_data('RGB', width*3, new_image)
@window.event
def on_draw():
window.clear()
image.blit(0, 0)
pyglet.app.run()
出于教育目的,我将其分解成更容易的块。
image = pyglet.image.SolidColorImagePattern((255,255,255,255)).create_image(width, height)
如上所述,创建纯白图像。它的宽度和高度与窗口大小相匹配。
然后我们抓取图像数据:
data = image.get_image_data().get_data('RGB', width*3)
此bytes
字符串将包含width*height*<format>
,这意味着20x20
图片将1200
字节大,因为RGB占用每个像素3个字节。
new_image = b''
for i in range(0, len(data), 3):
pixel = bytes([randint(0,255)]) + bytes([randint(0,255)]) + bytes([randint(0,255)])
new_image += pixel
整个块遍历所有像素(len(数据)只是一个方便的东西,你也可以做range(0, width*height*3, 3)
,但是meh。
3个randint(255)字节对象的像素连续组合成一个字符串,如下所示:
pixel = b'xffxffxff'
这也是我们在3
中逐步range(0, len(data), 3)
的原因。因为一个像素是3个字节&#34;宽&#34;。
一旦我们生成了所有像素(由于某种原因,字节对象image
无法修改..我可以发誓我修改了字节&#34;字符串&# 34;之前......我已经厌倦了,所以这可能是一个乌托邦式的梦想之类的东西。
无论如何,一旦完成所有甜蜜的图像构建,我们通过执行以下操作为图像对象提供新数据:
image.set_data('RGB', width*3, new_image)
就是这样。在-45度的冬日,阳光下的黄油很容易。
文档:
您也可以选择加入某个地区,然后修改某个地区..但我会在修补你的地方:)
答案 1 :(得分:1)
对于funsies,我将添加另一个更符合您可能需要的答案。因为窗口本身将是您通过以下方式决定的“清晰”颜色缓冲区:
window = pyglet.window.Window(width=width, height=height)
pyglet.gl.glClearColor(0.5,0,0,1) # Note that these are values 0.0 - 1.0 and not (0-255).
因此改变背景几乎是不可能的,因为它“没有”
但是,您可以通过.draw()
功能在背景上绘制像素。
import pyglet
from random import randint
width, height = 500, 500
window = pyglet.window.Window(width=width, height=height)
@window.event
def on_draw():
window.clear()
for i in range(10):
x = randint(0,width)
y = randint(0,height)
pyglet.graphics.draw(1, pyglet.gl.GL_POINTS,
('v2i', (x, y)),
('c3B', (255, 255, 255))
)
pyglet.app.run()
这将在背景上创建10个随机放置的白点
要添加上述内容,只需将.blit()
或.draw()
功能放在pyglet.graphics.draw()
行之后。
答案 2 :(得分:0)
您可以将像素分成背景&#39;图像&#39;。您可以查看this Stack Overflow问题。
答案 3 :(得分:0)
如果您是说背景色,我可以帮您。我知道有一个选项pyglet.gl.glClearColor函数。
例如,
import pyglet
from pyglet.gl import glClearColor
win = pyglet.window.Window(600, 600, caption = "test")
glClearColor(255, 255, 255, 1.0) # red, green, blue, and alpha(transparency)
def on_draw():
win.clear()
这将创建一个具有白色背景(而不是默认的黑色)的窗口