[英]Get Data from OpenGL glReadPixels(using Pyglet)
我在應用程序上的Python中使用Pyglet(和OpenGL),我正在嘗試使用glReadPixels獲取一組像素的RGBA值。 據我了解,OpenGL將數據作為打包的整數返回,因為這是將它們存儲在硬件上的方式。 但是出於明顯的原因,我想將其轉換為正常格式進行處理。 根據一些閱讀,我提出了這個建議: http : //dpaste.com/99206/ ,但是它失敗並出現IndexError。 我將如何去做呢?
您必須首先創建正確類型的數組,然后將其傳遞給glReadPixels:
a = (GLuint * 1)(0)
glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_INT, a)
要對此進行測試,請在Pyglet“ opengl.py”示例中插入以下內容:
@window.event
def on_mouse_press(x, y, button, modifiers):
a = (GLuint * 1)(0)
glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_INT, a)
print a[0]
現在,每當您在應用程序窗口中的某個位置單擊時,您都應該在鼠標光標下方看到像素的顏色代碼。
您可以使用PIL庫,這是我用來捕獲此類圖像的代碼段:
buffer = gl.glReadPixels(0, 0, width, height, gl.GL_RGB,
gl.GL_UNSIGNED_BYTE)
image = Image.fromstring(mode="RGB", size=(width, height),
data=buffer)
image = image.transpose(Image.FLIP_TOP_BOTTOM)
我想包括Alpha通道應該很簡單(可能只是用RGBA代替RGB,但我沒有嘗試過)。
編輯:我不知道pyglet OpenGL API與PyOpenGL有所不同。 我猜想必須更改以上代碼以將緩沖區用作第七個參數(符合較少的pythonic pyglet樣式)。
我可以使用glReadPixels(...)
獲得整個幀緩沖區,然后使用PIL寫入文件:
# Capture image from the OpenGL buffer
buffer = ( GLubyte * (3*window.width*window.height) )(0)
glReadPixels(0, 0, window.width, window.height, GL_RGB, GL_UNSIGNED_BYTE, buffer)
# Use PIL to convert raw RGB buffer and flip the right way up
image = Image.fromstring(mode="RGB", size=(window.width, window.height), data=buffer)
image = image.transpose(Image.FLIP_TOP_BOTTOM)
# Save image to disk
image.save('jpap.png')
我對alpha不感興趣,但是我敢肯定您可以輕松地添加它。
我被迫使用glReadPixels(...)
而不是Pyglet代碼
pyglet.image.get_buffer_manager().get_color_buffer().save('jpap.png')
因為使用save(...)
的輸出與我在Window中看到的不同。 (錯過了多采樣緩沖區?)
如果您閱讀了鏈接的片段,則可以理解,獲取“正常”值的最簡單方法是按正確的順序訪問數組。
這段代碼看起來像應該做的那樣。 如果不是,請對其進行調試,然后查看問題所在。
在進一步的審查中,我認為我的原始代碼基於某些C特定代碼,因為該數組只是一個指針,因此可以工作,因此使用指針算術可以得到特定的字節,這顯然不會轉換為Python。 是否有人使用另一種方法提取數據(我假設這只是對數據進行位移的問題)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.