使用pyglet绘制像素

1 投票
3 回答
1432 浏览
提问于 2025-04-16 09:02

我刚开始学习pyglet,想在每次on_draw执行的时候,把一个黑色的像素变成白色。这样经过1000次执行后,窗口里应该正好有1000个白色像素。不过,我希望在on_draw里不要调用1000次绘制操作。所以我想先创建一张图片,然后在这张图片上用RGB的方式修改像素,最后把这张图片显示到屏幕上。请问我该怎么做呢?pyglet的文档、示例和源代码对我帮助不大。

3 个回答

0

看起来在pyglet里没有简单的方法可以做到这一点。所以我决定放弃使用pyglet了。

1

虽然现在说这个可能有点晚,但其实有一些方法可以做到这一点。例如,有一个叫做 blit_into 的方法,它可以用来修改已经加载的图片:

import pyglet
window = pyglet.window.Window(600, 600)
background = pyglet.resource.image('my600x600blackbackground.bmp')
pix = pyglet.resource.image('singlewhitepixel.bmp').get_image_data()

def update(dt):
    background.blit_into(pix, x, y, 0) #specify x and y however you want

@window.event
def on_draw():
    window.clear()
    background.blit(0,0)

pyglet.clock.schedule(update, 1.0/30) #30 frames per second
pyglet.app.run()
2

因为没有人给出一个很好的答案。
所以我在这里放一个:

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()

简单来说,这段代码创建了一张白色的图片,这张图片可以在窗口中显示。不过因为我们想要使用 putpixel,我对这张白色图片的每一个像素进行了修改,作为演示。

这段代码可以和以下内容一起使用:

这个链接可以帮助你进一步优化图片的处理。

撰写回答