pixelwise drawing in pyglet (python)
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()
精彩评论