使用 Glut 和 OpenGL Python 捕获屏幕
Capture screen using Glut and OpenGL with Python
我正在使用 Python 和 OpenGL 进行一些与物理系统相关的计算,然后显示它们并能够操纵图像旋转它,平移它,...
我不是专业程序员,我使用 OpenGL 的经验很少,而且我在尝试获得我想要的东西时遇到了一些问题。我希望能够将我获得的 window 保存为视频文件中的输出,为此我看到了使用 glReadPixels
捕获每一帧然后将它们全部放入的可能性在一起。
我现在正在使用类似于以下代码的东西,我希望能够将帧保存到图像中,但是,尽管我已经能够使用 [=12 将像素保存到数组中=], 我不知道在哪里也不知道如何调用我定义为 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()
键盘、显示、动态和鼠标是之前定义的功能。
您可以在 glutSwapBuffers():
之后调用 glReadPixels()
glutSwapBuffers()
glReadBuffer(GL_FRONT)
glReadPixels(...)
或者 在之前:
glReadBuffer(GL_BACK)
glReadPixels(...)
glutSwapBuffers()
因此,应该从您的 "display" 函数调用 captureScreen(),该函数可能是调用 glutSwapBuffers()
的函数
我正在使用 Python 和 OpenGL 进行一些与物理系统相关的计算,然后显示它们并能够操纵图像旋转它,平移它,...
我不是专业程序员,我使用 OpenGL 的经验很少,而且我在尝试获得我想要的东西时遇到了一些问题。我希望能够将我获得的 window 保存为视频文件中的输出,为此我看到了使用 glReadPixels
捕获每一帧然后将它们全部放入的可能性在一起。
我现在正在使用类似于以下代码的东西,我希望能够将帧保存到图像中,但是,尽管我已经能够使用 [=12 将像素保存到数组中=], 我不知道在哪里也不知道如何调用我定义为 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()
键盘、显示、动态和鼠标是之前定义的功能。
您可以在 glutSwapBuffers():
之后调用 glReadPixels()glutSwapBuffers()
glReadBuffer(GL_FRONT)
glReadPixels(...)
或者 在之前:
glReadBuffer(GL_BACK)
glReadPixels(...)
glutSwapBuffers()
因此,应该从您的 "display" 函数调用 captureScreen(),该函数可能是调用 glutSwapBuffers()
的函数