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

sda*_*aau 5 gnome xorg compiz screenshot

我经常需要截取比当前显示的桌面大的窗口。我在 Ubuntu 11.04 上,gnome-about说版本:2.32.1;compiz --versionCompiz 0.9.4.0 说——我有四个虚拟桌面/工作区,它们是这样安排的:


上面的图像是通过移动到每个单独的工作区,并通过 PrintScreen 键(即gnome-screenshot. (我知道有更好的获取firefox镜头的方法,例如“页面保护程序”插件 - 以上只是作为通用超大窗口的示例)。

编辑:我显然在这里使用了错误的命名法(通过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 (ImageMagick)

并且它们都将只捕获整个应用程序窗口的一个“角落”,该窗口显示在当前桌面上(在如上所示的情况下)。当尝试捕获“root”或“全屏”时,所有这些都只捕获当前呈现的桌面(而不是所有虚拟桌面的总面积)。

我也尝试过shutter(0.87.2 Rev.1071),虽然我发现从0.86.4版本开始的信息,“你现在可以捕获所有虚拟桌面。快门会通过所有这些,给每个人拍照并将它们组合成一个大屏幕截图”-我确实尝试单击“捕获所有工作区”-但它只拍摄了当前工作区/桌面的快照;窗口捕获同样会在当前桌面的限制处剪切(或失败并显示“截屏时出错:可能无法抓取鼠标指针或所选区域无效。 ”如果窗口完全位于当前桌面以外的虚拟桌面中一)。

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

因此,我想问一些关于工具的建议,可以:

  • 一次性捕获总面积(所有工作区/虚拟桌面);或者
  • 捕获所选窗口的总面积,即使它被推到当前呈现的桌面之外(也是一次性的)

我更喜欢在内存中处理这些东西的东西 - 我自己可以想出更糟糕的东西:例如bash发送按键以更改桌面(或仅通过wmctrl)的脚本,并在那里获取单独的屏幕截图 - 但这会很痛苦使用,特别是因为我会在捕获屏幕截图时在视觉上暴露于“桌面切换”......如果没有任何完整的程序,建议 C/Perl/Python API 可以访问所有/任何虚拟机台式机也很棒。

sda*_*aau 4

好的,找到了 X windows 的这个:

\n\n

FVWM 论坛 \xe2\x80\xa2 查看主题 - 在另一个视口上缩略图窗口

\n\n
\n

至于为什么无法访问窗口(即,当它与当前视口不在同一桌面/页面上时对其拍照)是因为不在当前页面上的窗口未映射。当人们更改页面/桌面时,情况就是如此——窗口未映射,并且当前视口上的窗口被重新映射。

\n
\n\n

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

\n\n
    \n
  • 用于xrandr增加(四个)视口的虚拟大小
  • \n
\n\n

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

\n\n
$ xrandr -q\nScreen 0: minimum 320 x 200, current 1024 x 600, maximum 4096 x 4096\nLVDS1 connected 1024x600+0+0 (normal left inverted right x axis y axis) 0mm x 0mm\n   1024x600       60.0*+\n   800x600        60.3     56.2  \n   640x480        59.9  \nVGA1 disconnected (normal left inverted right x axis y axis)\n\n$ xrandr --output LVDS1 --panning 1600x768\n
Run Code Online (Sandbox Code Playgroud)\n\n

...另请参见X/Config/Resolution - Ubuntu Wiki

\n\n
    \n
  • 用于xvfb虚拟渲染
  • \n
\n\n

通过x11 - 远程离屏渲染 - 服务器故障得到这个,另请参阅Xvfb - 维基百科,免费百科全书的示例。这对我有用 - 每个命令都在自己的终端中(因为其中一些是服务)

\n\n
# start xvfb as display 1 - note the "screen 0" there refers to "its own" screen 0; should set it to 24-bit color\n\nXvfb :1 -screen 0 1600x1200x24 -pixdepths 3 -fp /usr/share/fonts/X11/Type1\n\n# start metacity on display 1 (would start gdm, but [Bug #598848: gdm no longer works with xvfb](https://bugs.launchpad.net/bugs/598848)\n# needed to we have title bars, and possibility to move windows around \n\nDISPLAY=:1 metacity\n\n# start application (here web-browser arora) again on display 1\n\nDISPLAY=:1 arora\n\n# start vnc server, which will bridge display 1 to port 5900\n# note - this command exists, however starts a server in background \n\nx11vnc -display :1 -bg -nopw -listen localhost -xkb\n\n# start vnc viewer on port 5900 - so we can see display 1:\n# note also - when vncviewer exits, it also will kill the x11vnc server\n\nvncviewer -FullColor=1 localhost:5900\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

vnc-xvfb.png

\n\n

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

\n\n

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

\n\n

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

\n


小智 4

在我的 FreeBSD 工作站上,我创建了一个 bash 脚本来捕获多个虚拟工作区,然后通过 ImageMagic“蒙太奇”运行结果来缝合它们。这是 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
Run Code Online (Sandbox Code Playgroud)

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

montage  desktop*.png  -tile 10x1 -geometry 1920x2160+1+1 workspaces.png
Run Code Online (Sandbox Code Playgroud)

显然,人们会为自己的系统更改-tile 和-geometry。;)

对于此解决方案,需要安装 bash、maim(或等效工具)、xdotool 和 ImageMagick montage。华泰