我在 PySide 中使用了一些带有 GUI 的软件(Nuke),我会抓取 PySide(奇怪)在 QWidget 中识别的 QGLWidget 的内容并将其编码为视频。
所以,我不能使用 QGLWidget.grabFrameBuffer():
AttributeError: 'PySide.QtGui.QWidget' object has no attribute 'grabFrameBuffer'
我试过了:
# Qwidget.render(QImage)
image = QtGui.QImage(child.width(),child.height(),QtGui.QImage.Format_RGB32)
child.render(image)
image.save( '/Volumes/LaCie_Work/_TMP/test/test0.png', 'PNG')
结果: http: //i.imgur.com/YwTtR2q.png - 问题:错过很多元素
# Qwidget.render(QPixmap)
image = QtGui.QPixmap(child.size())
child.render(image)
image.save( '/Volumes/LaCie_Work/_TMP/test/test1.png', 'PNG')
结果: http: //i.imgur.com/DqO1PBS.png - 问题:不!(见下文)
# QPixmap.grabWidget(QWidget)
image = QtGui.QPixmap.grabWidget(child)
image.save( '/Volumes/LaCie_Work/_TMP/test/test2.png', 'PNG')
结果: http: //i.imgur.com/9n9Hofy.png - 问题:不完全是,但没关系..(见下文)
# QPixmap.grabWindow(QWidget.winId())
image = QtGui.QPixmap.grabWindow(child.winId())
image.save( '/Volumes/LaCie_Work/_TMP/test/test2.png', 'PNG')
结果: http: //i.imgur.com/ewwDdZW.png - 问题:WTF?!
所有这些方法都是“可读的”,但是否在线程中,如果我在这个视口中创建一个简单的球体(或其他),软件(再次 Nuke)会崩溃。我不知道为什么...
我决定尝试使用 pyOpenGl:
# pyOpenGl glReadPixel
buffer = glReadPixels(0, 0, child.width(), child.height(), GL_RGB, GL_UNSIGNED_BYTE)
image = PIL.Image.fromstring(mode="RGB", size=(child.width(),child.height()), data=buffer)
image = image.transpose(PIL.Image.FLIP_TOP_BOTTOM)
image.save( '/Volumes/LaCie_Work/_TMP/test/test.png', 'PNG')
结果: http: //i.imgur.com/7oBEAgj.png - 问题:任何!:)
但...
需要在主线程中调用 glReadPixels 以获得正确的上下文并挂起软件......(每秒 12 到 24 帧):(
使用 Qt : 1) 为什么我的 QGLWidget 像 QWidget 一样被识别?(pyside错误?)2)这是一种强制grabFrameBuffer()的方法?3) 我可以将 QWidget 内容直播到 QGLWidget 并抓取它吗?
使用 PyOpenGL: 4) 我可以从线程访问特定的 Qwidget 帧缓冲区吗?5) 将 FBO 绑定到另一个新线程中?
非常欢迎任何帮助或建议!