【问题标题】:How can I get a screenshot from a not visible window of a application which uses OpenGL under X?如何从在 X 下使用 OpenGL 的应用程序的不可见窗口获取屏幕截图?
【发布时间】:2010-06-24 16:46:58
【问题描述】:

我正在尝试在 X 下制作一个不可见窗口的屏幕截图。

我的第一次尝试是使用xwdimport(来自ImageMagick)捕获窗口。 不幸的是,当窗口在其他一些窗口下时,隐藏的部分是黑色的。 更糟糕的是,当窗口不在当前桌面上时,我会收到 BadMatch 错误。

下一个想法是使用 Xnest,它会为这个应用程序创建一个新的 X 实例,并且它总是在顶部。我遇到了其他问题。 Xnest 不支持 OpenGL。

在 google 上进行一些搜索,我发现 [Xephyr][1] 确实支持 OpenGL...但不支持硬件加速,因此它不可接受,因为它会杀死我的 CPU。

Xvfb 也是如此,它也使用 CPU 来渲染 OpenGL。以下是glxinfo 的部分输出:

OpenGL 供应商字符串:Mesa Project OpenGL 渲染器字符串:Software Rasterizer OpenGL 版本字符串:2.1 Mesa 7.8.2 OpenGL着色语言版本字符串:1.20

我唯一能想到的就是以某种方式使用 Xlib 来强制我的 X 服务器将窗口渲染到 pixbuf。不幸的是,我对 Xlib 几乎一无所知。

所以我的问题是如何从在 X 下使用 OpenGL 的应用程序的不可见窗口获取屏幕截图?

目前我只能使用 [Python-Xlib][2] 和 PIL 制作屏幕截图。 也可以接受任何其他使用 Python 或 C 的解决方案。

【问题讨论】:

  • 在GL应用中只使用glReadPixels有什么问题?
  • 我没有源代码。

标签: screenshot x11 xlib


【解决方案1】:

据我所知,这是不可能的。问题是您试图保存的像素实际上并不存在。 X 服务器和视频驱动程序将避免渲染不可见的内容。

正如 Matias 所说,如果您可以控制 GL 应用程序,那么您可能可以在 GL 中做一些事情。例如帧缓冲对象扩展让您可以渲染到屏幕外纹理。

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    相关资源
    最近更新 更多