Я новичок в пиглете. Я хочу менять пиксель с черного на белый на каждой on_draw
итерации. Таким образом, после 1000 итераций в окне должно быть ровно 1000 белых пикселей. Однако я бы не хотел для этого вызывать 1000 операций рисования в on_draw
. Итак, я хотел бы создать изображение, сделать RGB-пиксель на изображении и вывести изображение на экран. Как я могу это сделать? Документация pyglet, примеры и исходный код не слишком помогают в этом.
putpixel с пиглетом
Ответы (3)
Так как никто не дал действительно хорошего ответа на этот вопрос.
Я размещу его здесь:
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
, я изменил каждый пиксель белого изображения в качестве демонстрации.
Может использоваться совместно с:
Который можно использовать для дальнейшей оптимизации манипулирования изображениями.
person
Torxed
schedule
26.02.2017
Спасибо за указатели кодов! Не могли бы вы добавить код в
on_draw
, который изменяет цвет 1 пикселя image
? Должно быть что-то вроде этого? pyglet.image.SolidColorImagePattern((200,100,0,255)).create_image(1,1).blit_into(image, x, y, 0)
или есть более эффективный способ putpixel
?
- person pts; 27.02.2017
@pts Я отвечу на ваш вопрос через несколько часов.
- person Torxed; 27.02.2017
Слишком поздно, чтобы помочь вам, но есть способы сделать это. Например, 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()
person
Joshua Dempster
schedule
15.12.2013
Это очень неэффективно, поскольку вам нужно загрузить с диска весь пиксель .bmp. Если ваш процессор быстрее, чем ваш жесткий диск, я бы предложил сделать следующее:
pix = pyglet.image.SolidColorImagePattern((255,255,255,255)).create_image(1,1)
, где 1,1
можно заменить любой свинкой пиксельного кластера, который вы хотите создать.
- person Torxed; 27.02.2017
Я думаю, это зависит от того, направлен ли вопрос конкретно на этот игрушечный пример или на более общий случай, когда вы хотите динамически изменить изображение. В любом случае, это не покадровая операция. Трудно представить себе вариант использования, когда вы будете загружать так много отдельных пикселей, что это каким-либо образом повлияет на производительность.
- person Joshua Dempster; 27.02.2017
Кажется, нет простого способа сделать это в pyglet. Поэтому я отказался от использования pyglet.
person
pts
schedule
29.04.2011