自动截取 X 中特定显示的屏幕截图

qub*_*dup 3 xorg screenshot multi-monitor

要在运行 X 且带有两个屏幕的系统上创建延时(实际上它是两个“显示器”上的一个“屏幕”),我该如何截取其中一个屏幕的屏幕截图?

xrandr 输出是(缩写):

屏幕 0:最小 320 x 200,当前 3840 x 1080,最大 16384 x 16384
DFP1 断开连接(正常左转右 x 轴 y 轴)
DFP2 断开连接(正常左转右 x 轴 y 轴)
DFP3 断开连接(正常左转右 x 轴 y 轴)
DFP4 断开连接(正常左转右 x 轴 y 轴)
DFP5 连接 1920x1080+0+0(正常左倒右 x 轴 y 轴) 598mm x 336mm
   1920x1080 60.00*+ 50.00 59.94 50.00 60.00 59.94  
   [...]
DFP6 断开连接(正常左转右 x 轴 y 轴)
DFP7连接1920x1080+1920+0(正常左倒右x轴y轴)598mm x 336mm
   1920x1080 60.00*+ 50.00 59.94 50.00 60.00 59.94  
   [...]
CRT1断线(正常左倒右x轴y轴)

要求:

  1. 最小的开销
  2. 桌面环境不可知
  3. 自动的
  4. 按名称选择的屏幕

1、2 和 3 表示该工具最好在命令行中运行。

qub*_*dup 7

ImageMagickimport可以自动截取 Xorg 的根目录,并且-crop只使用需要的部分。xrandr为 提供参数crop

为了最大限度地减少开销,您应该构造import命令一次,而不是每次截屏时都使用显示名称进行查询:

mapfile -t displays < <(xrandr | grep ' connected')
get_date='`date +"%Y%m%d-%H%M%S"`'
for (( i=0; i<${#displays[@]}; i++)); do
  name=`echo ${displays[i]} | cut -d " " -f 1`
  crop=`echo ${displays[i]} | cut -d " " -f 3`
  echo import -silent -window root -crop ${crop} \"${name}-${get_date}.png\"
done
Run Code Online (Sandbox Code Playgroud)

mapfile 和 for 循环的说明可以在这个问题中找到。

这将为您提供如下命令:

import -silent -window root -crop 1920x1080+0+0 "DFP5-`date +"%Y%m%d-%H%M%S"`.png"
import -silent -window root -crop 1920x1080+1920+0 "DFP7-`date +"%Y%m%d-%H%M%S"`.png"
Run Code Online (Sandbox Code Playgroud)

您现在可以在 while 循环中使用它来进行游戏中时光倒流(以 停止ctrl+c)。

while [ 1 ]; do
  import ...
  sleep 1 # for 1 second delay between screenshots
done
Run Code Online (Sandbox Code Playgroud)

这是我知道的唯一方法。希望有一些方法可以减少开销。