我正在尝试在X下制作一个不可见窗口的屏幕截图。
我的第一次尝试是使用xwd
或import
(来自ImageMagick)捕获窗口。
不幸的是,当窗口在某些其他窗口下时,隐藏的部分是黑色的。
更糟糕的是,当窗口不在当前桌面上时,我收到BadMatch
错误。
接下来的想法是使用Xnest,它将为这个应用程序创建一个新的X实例,并且它总是在顶部。我遇到了其他问题。 Xnest不支持OpenGL。
在google上进行一些搜索,我发现[Xephyr] [1]确实支持OpenGL ...但硬件没有加速,所以它不能用来杀死我的CPU。
Xvfb也是如此,它也使用CPU来渲染OpenGL。以下是glxinfo
:
OpenGL vendor string: Mesa Project OpenGL renderer string: Software Rasterizer OpenGL version string: 2.1 Mesa 7.8.2 OpenGL shading language version string: 1.20
我唯一能想到的就是以某种方式使用Xlib来强制我的X服务器将窗口渲染到pixbuf。不幸的是,我几乎不了解Xlib。
所以我的问题是如何从X下使用OpenGL的应用程序的不可见窗口中获取屏幕截图?
就目前而言,我只能使用[Python-Xlib] [2]和PIL制作截图。 使用Python或C的任何其他解决方案都是可以接受的。
答案 0 :(得分:0)
据我所知,这是不可能的。问题是您尝试按字面意思保存的像素不存在。 X服务器和视频驱动程序将避免渲染无论如何都不可见的东西。
如果你可以控制GL应用程序,你可能会在GL中做些事情,正如Matias所提到的那样。例如framebuffer对象扩展允许您渲染到屏幕外纹理。