2017-02-26 357 views
0

我正在創建一個程序,該程序必須更改pyglet窗口中各個像素的顏色。我無法找到任何方式在文檔中執行此操作。有沒有辦法做到這一點?如何更改pyglet窗口的顏色

回答

0

對於funsies,我會添加另一個答案,更符合你可能需要的線。由於窗口本身將是你決定什麼「清晰」顏色緩衝區通過:

window = pyglet.window.Window(width=width, height=height) 
pyglet.gl.glClearColor(0.5,0,0,1) # Note that these are values 0.0 - 1.0 and not (0-255). 

因此改變背景幾乎是不可能的,因爲它是「無」。
但是,您可以通過.draw()函數在背景上繪製像素。

import pyglet 
from random import randint 

width, height = 500, 500 
window = pyglet.window.Window(width=width, height=height) 

@window.event 
def on_draw(): 
    window.clear() 
    for i in range(10): 
     x = randint(0,width) 
     y = randint(0,height) 
     pyglet.graphics.draw(1, pyglet.gl.GL_POINTS, 
       ('v2i', (x, y)), 
       ('c3B', (255, 255, 255)) 
      ) 

pyglet.app.run() 

這將在背景上創建10個隨機放置的白點。
要添加上面的任何內容,只需在pyglet.graphics.draw()行之後放置您的.blit().draw()功能即可。

0

你可以將像素分成背景'圖像'。你可以看看this堆棧溢出問題。

0

您可以使用魔術功能SolidColorImagePattern並修改您需要的數據。

R,G,B,A = 255,255,255,255 
pyglet.image.SolidColorImagePattern((R,G,B,A).create_image(width,height) 

這是一個.blit():圖像。它是白色的,可能不是你想要的。
所以我們會做一些更多的巫術和換出隨機以外的所有像素(螞蟻的戰爭):

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() 

教育目的,我將它分解爲更簡單的塊。

image = pyglet.image.SolidColorImagePattern((255,255,255,255)).create_image(width, height) 

如前所述,創建一個純白色圖像。它的寬度和高度與窗口大小相匹配。

我們再搶的圖像數據:

data = image.get_image_data().get_data('RGB', width*3) 

bytes字符串將包含width*height*<format>,這意味着20x20圖像將1200字節大,因爲RGB佔用每個像素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 

這整個塊遍歷所有像素(LEN(數據)只是一個方便的事情,你可以做range(0, width*height*3, 3)爲好,但咩。
3 randint的像素contists(255)字節的目標相結合成一個字符串,像這樣:。

pixel = b'xffxffxff' 

這也是爲什麼我們在range(0, len(data), 3)步驟3的原因,因爲一個像素是3個字節「寬」

一旦我們發電機密封編輯所有的像素(由於某種原因,字節對象image不能被修改..我可以發誓我已經修改字節「字符串」之前..我厭倦壽,所以這可能是一個烏托邦夢或什麼。
總之,一旦所有的甜美形象建設完成後,我們給圖像對象是新的數據做:

image.set_data('RGB', width*3, new_image) 

就是這樣。在-45度冬季的日子裏,您可以在陽光下輕鬆享用黃油。

文檔:

您也可以選擇在獲得區域,只是修改一個區域..但我會留下修補給你:)