在pyglet中逐像素绘图(Python)
好的,我已经厌倦了不停地在网上搜索和翻阅各种文档,却没有找到结果。
我的目标很简单:让pyglet逐个像素地绘制一张图片。
我已经搜索了好几个小时,还是没有找到答案。有没有人能给我一个简单的程序示例,展示如何在屏幕上逐个像素地指定颜色绘制?比如:从黑色到白色的渐变。
2 个回答
1
你可以使用一个叫做ImageData的对象,然后把它绘制出来。下面是一个例子:
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()
8
只要你明白这会花费很长时间……:
pyglet.graphics.draw
可以绘制一个或多个点,当你传入 pyglet.gl.GL_POINTS
时,你还可以传入一些属性,比如颜色和坐标。例如:
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))
)
这段代码绘制了一个 50x50 的正方形,里面有从黑色到白色的渐变。只不过别指望它会特别快地完成这个任务;-) -- OpenGL 主要是为了处理更高层次的图形,而不是逐个像素地绘制。
你可以通过一次计算(比如)一行的方式来稍微提高速度,然后再绘制这一行,而不是一个一个像素地画。但这样做也不会特别快!-)