putpixel с пиглетом

Я новичок в пиглете. Я хочу менять пиксель с черного на белый на каждой on_draw итерации. Таким образом, после 1000 итераций в окне должно быть ровно 1000 белых пикселей. Однако я бы не хотел для этого вызывать 1000 операций рисования в on_draw. Итак, я хотел бы создать изображение, сделать RGB-пиксель на изображении и вывести изображение на экран. Как я могу это сделать? Документация pyglet, примеры и исходный код не слишком помогают в этом.


person pts    schedule 25.12.2010    source источник


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

Кажется, нет простого способа сделать это в pyglet. Поэтому я отказался от использования pyglet.

person pts    schedule 29.04.2011