开发者

pixelwise drawing in pyglet (python)

开发者 https://www.devze.com 2023-01-12 03:24 出处:网络
OK. I\'m tired of googling and reading throught lots of documentation with no results. My aim is simple: get pyglet to draw an image pixel by pixel.

OK. I'm tired of googling and reading throught lots of documentation with no results.

My aim is simple: get pyglet to draw an image pixel by pixel.

I've been searching for hours with no results. Can anyone give an example of a short program that draws in a display s开发者_运维问答pecifying the color pixel by pixel? For example: drawing a gradient from black to white.


As long as you realize this is going to take a long time...:

pyglet.graphics.draw can drawn one or more points when you pass it pyglet.gl.GL_POINTS, and you can pass attributes such as color as well as coordinates. For example:

for i in range(50):
    for j in range(50):
        color = int(2.56 * (i + j))
        pyglet.graphics.draw(1, pyglet.gl.GL_POINTS,
            ('v2i', (i, j)),
            ('c3B', (color, color, color))
        )

draws a 50 by 50 square with a diagonal gradient from black to white-ish. Just don't expect it to be particularly fast at doing that;-) -- GL is really oriented to graphics with much higher level of abstraction, not "pixel by pixel" painting.

You could get a modicum of extra speed by computing (say) a row at a time, and drawing that, instead of actually drawing pixels singly. But it still won't be super-fast!-)


You can use an ImageData object and blit it. Here is an example:

import numpy as np
import pyglet


WIDTH = 512
HEIGHT = 512
RGB_CHANNELS = 3
MAX_COLOR = 255


screen = np.zeros(
    [HEIGHT, WIDTH, RGB_CHANNELS], dtype=np.uint8
)
IMG_FORMAT = 'RGB'
pitch = WIDTH * RGB_CHANNELS
window = pyglet.window.Window(WIDTH, HEIGHT)

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


if __name__ == '__main__':
    image_data = pyglet.image.ImageData(
        WIDTH, HEIGHT, IMG_FORMAT, screen.tobytes(), pitch
    )
    # Use a numpy array to store the pixels
    for j in range(HEIGHT):
        screen[j, :, :] = round((j / HEIGHT) * MAX_COLOR)
    # Flip the up coordinates
    data = np.flipud(screen).tobytes()
    # If your pixels change you can use set_data
    image_data.set_data(IMG_FORMAT, pitch, data)
    pyglet.app.run()
0

精彩评论

暂无评论...
验证码 换一张
取 消