我有一个MDI http://en.wikipedia.org/wiki/Multiple_document_interface用 Qt 编写的应用程序。一些子窗口包括QGLWidget
s,即 OpenGL 上下文。其中最突出的是使用 OpenGL 顶点和片段着色器来可视化其数据。
我需要以编程方式捕获应用程序主窗口的屏幕截图,当然包括所有恰好可见的子窗口。一开始听起来很简单(“肯定被问过很多次了,所以让我们用谷歌搜索一下吧!”),但仔细一看,似乎变得有点棘手......
现在这是我到目前为止所尝试过的:
-
QPixmap::grabWidget http://doc.trolltech.com/4.5/qpixmap.html#grabWidget不适用于使用着色器程序的子窗口,显然是因为重定向上下文似乎不支持必要的 OpenGL 扩展。 (渲染代码检查关联的上下文是否支持所需的扩展,如果不支持则拒绝继续。)
-
QPixmap::grabWindow http://doc.trolltech.com/4.5/qpixmap.html#grabWindow默默地将所有 OpenGL 上下文留空——即使是那些仅使用基本基元的上下文。
-
QGLWidget::grabFrameBuffer http://doc.trolltech.com/4.5/qglwidget.html#grabFrameBuffer有效,但仅捕获特定子窗口的 OpenGL 上下文,而我想获取整个应用程序(本质上是
Alt+PrtScr
在 Windows 中也是如此)。
我还尝试先执行#2,然后对所有子窗口迭代#3,只需将#3 的结果复制到#2 图像的正确位置。这种方法效果很好,直到我让一些子窗口重叠——在这种情况下,#3 中的图像会覆盖子窗口框架等。因此,这种方法可能需要更多的代码才能处理所有令人讨厌的极端情况......
一些额外的背景:一旦我得到屏幕截图,我将把其中的几个放在一个序列中以创建视频 - 可能使用ffmpeg http://ffmpeg.org/。这使得这个问题成为(第一部分)的延续我之前的问题 https://stackoverflow.com/questions/154730/capturing-video-out-of-an-opengl-window-in-windows;只是该应用程序已从单上下文独立 OpenGL 程序发展为使用 Qt 进行整体窗口和 UI 小部件内容,并将图形嵌入子窗口中的程序。
虽然我当然更喜欢一个漂亮的、类似 Qt 的跨平台解决方案,但我也愿意考虑诉诸 Windows 特定的 hack。 (这应该是可能的,正如我所看到的Alt+PrtScr
做了非常正确的事情。)
那么,有什么建议吗?
非常黑客,但确实捕获桌面(不隐藏窗口),就像本教程 http://doc.trolltech.com/4.2/desktop-screenshot.html并裁剪除窗户工作之外的所有内容?
更一般地说,我什至不确定 OpenGL 规范是否要求输出必须放置在前缓冲区中:实现可以仅使用视频覆盖(或 Voodoo2 式 VGA 直通恶作剧)进行输出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)