截取所有(或特定)虚拟桌面/工作区(或:超出/大于当前桌面的窗口)的屏幕截图?

截取所有(或特定)虚拟桌面/工作区(或:超出/大于当前桌面的窗口)的屏幕截图?

我经常需要截取比当前显示的桌面更大的窗口的屏幕截图。我在 Ubuntu 11.04 上,gnome-about版本号:2.32.1;compiz --versionCompiz 0.9.4.0——我有四个虚拟桌面/工作区,它们的排列方式如下:


上述图像是通过移动到每个单独的工作区并通过 PrintScreen 键截取屏幕截图获得的 - 也就是说gnome-screenshot。(我知道有更好的方法来获取firefox截图,比如“Page Saver”插件 - 以上只是作为一个通用超大窗口的示例)。

编辑:我显然在这里使用了错误的命名法(找到通过xorg - 获取当前虚拟桌面 - 编号/名称/标签/id? - Unix 和 Linux)——在上面的例子中,我仍然只有一个工作区;相反,改变的是视口 - 这是wmctrl -d每个“虚拟桌面”上显示的内容:

$ wmctrl-d
0 * DG: 2048x1200 VP: 0,0 WA: 0,1 1024x598 工作区 1
$ wmctrl-d
0 * DG: 2048x1200 VP: 0,600 WA: 0,1 1024x598 工作区 1
$ wmctrl-d
0 * DG: 2048x1200 VP: 1024,0 WA: 0,1 1024x598 工作区 1
$ wmctrl-d
0 * DG:2048x1200 VP:1024,600 WA:0,1 1024x598 工作区 1

因此,为了从命令行在“虚拟桌面”之间切换,我实际上应该更改“视口”,如下所示:wmctrl -o 1024,0

显然,移动到每个虚拟桌面、截取屏幕截图并将它们拼接在一起 - 最后剪切应用程序窗口 - 有点繁琐,所以我想知道是否有一个工具(最好是命令行)可以让我选择一个比当前桌面更大的窗口,并一次性截取其所有内容的屏幕截图。这里也可能有两种情况:

  • 大于桌面的窗口被移动,因此它占用了多个虚拟桌面上的空间(就像上面的图片显示的那样
  • 移动大于桌面的窗口外部所有虚拟桌面的总大小(从上图左上角桌面的角度来看,想象一下将应用程序窗口移向左上角,并移到桌面区域之外 - 而不是像上图那样移动到右下角

第一种情况是可能的,如果没有其他方式,那么手动(正如我上面所做的那样) - 对于第二种情况,我猜应用程序应该可以将窗口短暂地“移动”到总桌面区域 - 或者创建一个未在屏幕上显示的“虚拟”图形上下文,并在那里渲染窗口(虽然,我不知道足够多的细节来确定)。

到目前为止我已经尝试过以下工具:

  • gnome-screenshot
  • xwd
  • scrot
  • import(图像魔法)

它们都只会捕获整个应用程序窗口的“一角”,该窗口显示在当前桌面上(如上所示)。当尝试捕获“根”或“全屏”时,所有这些只会捕获当前呈现的桌面(而不是所有虚拟桌面的总区域)。

我也尝试过shutter(0.87.2 Rev.1071),虽然我发现从 0.86.4 版本开始,“现在你可以捕获所有虚拟桌面。Shutter 将浏览所有虚拟桌面,拍摄每张桌面的照片,并将它们合成一张大截图” - 我确实尝试点击“捕获所有工作区” - 但它只拍摄当前工作区/桌面;窗口捕获同样在当前桌面的边界处被剪切(或失败,显示“截屏时出错:可能是无法抓取鼠标指针或选定的区域无效。“如果窗口完全位于当前桌面以外的虚拟桌面中)。

然后我读到有一个屏幕截图插件compiz- 因为这里compiz管理虚拟桌面,我认为它可以处理整个区域 - 但是那里没有设置(在 CompizConfig 设置管理器中),但是:“启用插件”,输出目录,以及一个用于启用和设置“启动矩形屏幕截图”热键的按钮 - 而且因为显然你唯一能做的就是用鼠标拖动来指定一个矩形区域,我怀疑该插件是否有助于一次性捕获整个区域。

因此,我想征求一些有关工具的建议,这些工具可以:

  • 一次性捕获整个区域(所有工作区/虚拟桌面);或
  • 捕获选定窗口的全部区域,即使它被推到当前呈现的桌面之外(也可以一次性完成)

我更喜欢在内存中处理这些东西的东西——我自己可能会想出更糟糕的东西:比如bash发送击键来更改桌面的脚本(或者直接通过wmctrl),并在那里截取单独的屏幕截图——但使用起来会很麻烦,特别是因为在截取屏幕截图时我会直观地看到“桌面切换”...如果没有完整的程序,那么对于可以访问所有/任何虚拟桌面上的位图数据的 C/Perl/Python API 的建议也很好。

答案1

好的,在 X windows 中找到了它:

FVWM 论坛 • 查看主题 - 在另一个视口上缩略显示窗口

至于为什么您无法访问窗口(即当窗口不在与当前视口相同的桌面/页面上时,无法拍摄窗口的照片)是因为当前页面上未映射的窗口。当更改页面/桌面时,情况确实如此 - 窗口未映射,而当前视口上的窗口被重新映射。

所以,我想这意味着我想要的是不可能的?虽然有两种解决方法:

  • 用于xrandr增加(四个)视口的虚拟尺寸

这对我有用——首先查询以查看您想要的输出,然后执行:

$ xrandr -q
Screen 0: minimum 320 x 200, current 1024 x 600, maximum 4096 x 4096
LVDS1 connected 1024x600+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1024x600       60.0*+
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)

$ xrandr --output LVDS1 --panning 1600x768

... 也可以看看X/配置/分辨率 - Ubuntu Wiki

  • 用于xvfb虚拟渲染

通过x11 – 远程屏幕外渲染 - 代码日志,另见Xvfb - 维基百科,自由的百科全书例如。这是对我有用的方法 - 每个命令都进入自己的终端(因为其中一些是服务)

# start xvfb as display 1 - note the "screen 0" there refers to "its own" screen 0; should set it to 24-bit color

Xvfb :1 -screen 0 1600x1200x24 -pixdepths 3 -fp /usr/share/fonts/X11/Type1

# start metacity on display 1 (would start gdm, but [Bug #598848: gdm no longer works with xvfb](https://bugs.launchpad.net/bugs/598848)
# needed to we have title bars, and possibility to move windows around 

DISPLAY=:1 metacity

# start application (here web-browser arora) again on display 1

DISPLAY=:1 arora

# start vnc server, which will bridge display 1 to port 5900
# note - this command exists, however starts a server in background 

x11vnc -display :1 -bg -nopw -listen localhost -xkb

# start vnc viewer on port 5900 - so we can see display 1:
# note also - when vncviewer exits, it also will kill the x11vnc server

vncviewer -FullColor=1 localhost:5900

这里的问题是,并不是操作系统的所有部分都已初始化 - 因此没有窗口装饰,只有基本的 X 字体;但是,应用程序可以找到自己的字体,如下所示:

vnc-xvfb.png

xvfb对我来说这几乎是理想的——因为我基本上可以设置一个“不可见”的环境,大小随我所需,然后直接从中截取屏幕截图(使用xwd)。问题是我无法在“我的”DISPLAY=:0 上有一个窗口,然后将其切换到“虚拟”DISPLAY=:1 进行屏幕截图,然后将其恢复到 DISPLAY=:0。然后必须专门为设置一个应用程序xvfb;如果发生这种情况,您需要更大的尺寸——那么上面的整个链需要重新启动。

另一方面,我发现使用 4 个工作区大视口(使用鼠标在视口内移动)有点令人困惑 - 然后再次,可以动态更改大小并且不需要重新启动;另外我可以使用任何常用的屏幕截图工具(但我仍然必须切换视口)。

不用说,我仍然很想听到一个可能的命令行解决方案,可以一次性完成这种截屏:)

答案2

在我的 FreeBSD 工作站上,我创建了一个 bash 脚本来捕获多个虚拟工作区,然后通过 ImageMagic“montage”运行结果以拼接它们。以下是 bash 脚本:

#!/usr/local/bin/bash
dnum=$(xdotool get_num_desktops)
desk=0
while [[ "$desk" -lt "$dnum" ]];
     do
          xdotool set_desktop $desk;
          sleep 2;
          maim --format png /dev/stdout > ~/capture/desktop$desk.png;
          desk=$((desk+1));
     done

这是我在 ~/capture/ 目录中运行的将它们拼接在一起的命令:

montage  desktop*.png  -tile 10x1 -geometry 1920x2160+1+1 workspaces.png

显然,人们会根据自己的系统改变 -tile 和 -geometry。;)

要解决此问题,需要安装 bash、maim(或同等软件)、xdotool 和 ImageMagick montage。HTH

相关内容