使用 Glut 和 OpenGL 和 Python 捕获屏幕

Posted

技术标签:

【中文标题】使用 Glut 和 OpenGL 和 Python 捕获屏幕【英文标题】:Capture screen using Glut and OpenGL with Python 【发布时间】:2015-08-17 13:55:31 【问题描述】:

我正在使用 Python 和 OpenGL 进行一些与物理系统相关的计算,然后显示它们,并能够操纵图像旋转、平移、...

我不是专业的程序员,而且我没有使用 OpenGL 的经验,并且在尝试获得我想要的东西时遇到了一些问题。我希望能够将获得的窗口作为输出保存在视频文件中,为此我看到了使用glReadPixels 捕获每一帧然后将它们放在一起的可能性。

我现在正在使用类似于以下代码的代码,我希望能够将帧保存到图像中,但是,虽然我已经能够使用glReadPixels 将像素保存到数组中,但我不知道在哪里也不知道如何调用我定义为captureScreen 的函数。我应该怎么做才能得到我正在寻找的输出?

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from PIL import Image
from scipy import *
import numpy as np
import random as rnd

def captureScreen(file_):

    glPixelStorei(GL_PACK_ALIGNMENT, 1)
    data = glReadPixels(0, 0, 800, 800, GL_RGBA, GL_UNSIGNED_BYTE)
    image = Image.fromstring("RGBA", (800, 800), data)
    image.save(file_, 'png')

def main():  

     glutInit(sys.argv)
     glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
     glutInitWindowPosition(0, 0)
     glutInitWindowSize(800, 800)

     glutCreateWindow ("Test")

     glEnable(GL_DEPTH_TEST)
     glDepthMask(GL_TRUE)
     glEnable(GL_BLEND)
     glEnable(GL_TEXTURE_2D)
     glEnable(GL_COLOR_MATERIAL)
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
     glPointSize( 6.0 )
     glLineWidth( 2.0 )
     glEnable(GL_POINT_SMOOTH)
     glEnable(GL_LINE_SMOOTH)
     glHint(GL_LINE_SMOOTH_HINT, GL_NICEST)
     glEnable(GL_POLYGON_SMOOTH)
     glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST)

     glEnableClientState(GL_VERTEX_ARRAY)
     glEnableClientState(GL_COLOR_ARRAY)

     glClearColor(0.0, 0.0, 0.0, 0.0)

     glutFullScreen()
     glutKeyboardFunc(keyboard)
     glutIdleFunc(dynamics)
     glutDisplayFunc(display)
     glutMouseFunc(mouse)


     glutMainLoop()


if __name__ == '__main__':

     main()

键盘、显示器、动态和鼠标是之前定义的功能。

【问题讨论】:

【参考方案1】:

您可以在 glutSwapBuffers() 之后调用 glReadPixels():

glutSwapBuffers()
glReadBuffer(GL_FRONT)
glReadPixels(...)

或者只是之前

glReadBuffer(GL_BACK)
glReadPixels(...)
glutSwapBuffers()

所以 captureScreen() 应该从您的“显示”函数中调用,这可能是调用 glutSwapBuffers() 的函数

【讨论】:

你的意思是之前 glutSwapBuffers?调用 glutSwapBuffers() 后,后台缓冲区的内容(glReadPixels() 从中读取)将是未定义的。 非常感谢,它真的很有帮助。

以上是关于使用 Glut 和 OpenGL 和 Python 捕获屏幕的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 和 GLUT 创建 FPS 风格的运动系统

OpenGL - 使用 g++ 链接 glew 和 glut 库和 dll

如何在 osx 上使用 waf 链接 opengl 和 glut?

OpenGL:gl.h、glut 和 glew

opengl中如何实现图象的缩放

如何使用 glut 和 openGL 改变颜色?