1

我在 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 绑定到另一个新线程中?

非常欢迎任何帮助或建议!

4

0 回答 0