【发布时间】:2012-11-20 18:44:50
【问题描述】:
这个问题和这个问题类似
Fastest method of screen capturing
但对于 linux/X11。
更具体地说,我需要一种方法来捕获在 X11 显示器上运行的一个窗口的像素图像(程序等效于窗口中的 alt-print 屏幕)。
注意事项和要求:
1) 即使在正在捕获的窗口之上放置了一个新窗口,像素图像仍应指向原始应用程序窗口而没有任何遮挡
2) 用户不需要看到应用程序窗口,我只需要存储像素缓冲区/图像用于视频目的
我探索过的其他替代方案是:
1) xvfb - 它可以工作,但它可以进行 CPU 渲染,这很慢而且 浪费了好GPU
2) x11 在许多 lxc 中 - 理论上可以工作,但很复杂 设置,我不确定它是否能很好地适应许多窗口 捕获
欢迎提出建议和想法
【问题讨论】:
-
如果窗口被覆盖,你读到的内容是未定义的。
-
是的,CPU 渲染速度很慢而且很浪费,但是这样的性能慢到无法接受吗?此外,根据您使用的窗口管理器,如果它是一个合成窗口管理器,您可以寻找一个特定于 wm 的 API,它可以为您提供指向应用程序屏幕外缓冲区的指针。然后,您所要做的就是在应用程序重绘之前复制缓冲区。
-
@RobertMason,这会起作用,如果有人可以建议一个窗口管理器 1)支持 GPU 加速渲染(我知道关于 x11 架构的 zilch,但我想那是通过扩展完成)和 2)支持特定类型的 API
-
@RobertMason,(在 xvfb 中运行应用程序的)性能并没有令人无法接受的慢,只是足够慢,因此值得花时间寻找替代品
-
如果可以的话,你可以使用 wmctrl 或 xdotool 来激活一个窗口,xwininfo 对于获取 xwd 的窗口 id 也很有用(如果你使用 xwd 将它输出到 > name.xwd 和一些图像程序将能够在本机打开它)
标签: c++ c linux screenshot x11