Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从OpenGL glReadPixels获取数据(使用Pyglet)_Python_Opengl_Graphics_Pyglet_Glreadpixels - Fatal编程技术网

Python 从OpenGL glReadPixels获取数据(使用Pyglet)

Python 从OpenGL glReadPixels获取数据(使用Pyglet),python,opengl,graphics,pyglet,glreadpixels,Python,Opengl,Graphics,Pyglet,Glreadpixels,我在一个应用程序上使用Python中的Pyglet(和OpenGL),我尝试使用glReadPixels获取一组像素的RGBA值。据我所知,OpenGL以压缩整数的形式返回数据,因为这就是它们在硬件上的存储方式。不过,出于显而易见的原因,我希望将其转换为正常格式,以便使用。根据一些阅读,我得出了这样的结论:,但是它在索引器中失败了。我该怎么做呢?如果您阅读了链接到的代码片段,您就会明白获取“正常”值的最简单方法就是按正确的顺序访问数组。 这个片段看起来应该能完成任务。如果没有,请调试它并查看问题

我在一个应用程序上使用Python中的Pyglet(和OpenGL),我尝试使用glReadPixels获取一组像素的RGBA值。据我所知,OpenGL以压缩整数的形式返回数据,因为这就是它们在硬件上的存储方式。不过,出于显而易见的原因,我希望将其转换为正常格式,以便使用。根据一些阅读,我得出了这样的结论:,但是它在索引器中失败了。我该怎么做呢?

如果您阅读了链接到的代码片段,您就会明白获取“正常”值的最简单方法就是按正确的顺序访问数组。

这个片段看起来应该能完成任务。如果没有,请调试它并查看问题所在。

如果您阅读了链接到的代码段,您可以理解获取“正常”值的最简单方法就是按正确的顺序访问数组。

这个片段看起来应该能完成任务。如果没有,请调试它并查看问题所在。

您可以使用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 API不同。我想必须更改上面的代码,才能将缓冲区用作第七个参数(符合不太pythonic的pyglet样式)。

您可以使用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 API不同。我想必须更改上面的代码,以使用缓冲区作为第七个参数(符合不太pythonic的pyglet风格)。

进一步查看后,我相信我的原始代码是基于一些C特定的代码,因为数组只是一个指针,所以我使用指针算法可以得到特定的字节,这显然不能转化为Python。有人知道如何使用不同的方法提取数据吗(我想这只是数据的位移位问题)。

进一步查看后,我相信我的原始代码是基于一些C特定的代码,因为数组只是一个指针,所以我使用指针算法可以得到特定的字节,这显然不能转化为Python。是否有人知道如何使用不同的方法提取该数据(我假设这只是数据的位移位问题)。

您必须首先创建一个正确类型的数组,然后将其传递给glReadPixels:

a = (GLuint * 1)(0)
glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_INT, a)
要测试这一点,请在Pyglet“opengl.py”示例中插入以下内容:


现在,无论何时单击应用程序窗口中的某个位置,您都应该在鼠标光标下看到像素的颜色代码。

您必须首先创建正确类型的数组,然后将其传递给glReadPixels:

a = (GLuint * 1)(0)
glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_INT, a)
要测试这一点,请在Pyglet“opengl.py”示例中插入以下内容:


现在,无论何时单击应用程序窗口中的某个位置,您都应该可以在鼠标光标下看到像素的颜色代码。

我能够使用
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(…)
的输出与我在窗口中看到的不同。(多采样缓冲区丢失?

我能够使用
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(…)
的输出与我在窗口中看到的不同。(多采样缓冲区丢失?

嗯,glReadPixels返回的数据只是一个具有n个值的数组,其中n是区域中的像素数。实际上我不确定这个片段是否有意义,它或多或少是我读过的东西的合并。嗯,glReadPixels返回的数据只是一个具有n个值的数组,其中n是区域中的像素数。我不确定这个片段是否有任何意义,它或多或少是我读过的东西的合并。当我尝试这样做时,我得到一个类型错误,glReadPixels接受7个参数,而不是6个。你确定吗?我在不同的机器上使用了不同版本的PyOpenGL代码。也许是pyglet特有的?可能会将缓冲区变量作为第七个参数传递。当我尝试此操作时,我得到一个类型错误,glReadPixels接受7个参数,而不是6个。是否确定?我在不同的机器上使用了不同版本的PyOpenGL代码。也许是pyglet特有的?可能将缓冲区变量作为第七个参数传递。这是一个很好的例子,尽管我很幸运地将
a
定义为
GLubyte
并使用
GL\u UNSIGNED\u BYTE
。如果使用这些,拾取的颜色将返回为0到255之间的值,而不是不可理解的
long
s。这是一个很好的示例,尽管我很幸运地将
a
定义为
GLubyte
并使用
GL\u UNSIGNED\u BYTE
。如果使用这些,拾取的颜色将返回为0到255之间的值,而不是不可理解的
long
s。