命令行工具分别截取多个显示器



>问题陈述

我使用scrot来截取屏幕截图,除非我有多个显示器或显示器,否则效果很好。在这种情况下,scrot将不同监视器的屏幕截图合并到一个输出中。

在手册页中,scrot支持-m选项:

-m, --multidisp
For multiple heads, grab shot from each and join them together.

所以我想象默认行为是不将它们连接在一起。然而,事实并非如此。即使没有-m选项,我也会收到加入的屏幕截图。

我乐观地认为scrot应该能够做到这一点,因为它支持-u选项:

-u, --focused
Use the currently focused window.

这工作得很好。

我还检查了另一个名为maim的 CLI 工具 - 但我再次无法弄清楚如何分别截取不同显示器的屏幕截图。

所以我所排除的解决方案应该像这样工作:

screenshot_command <display_name> # and other options

仅截取显示<display_name>

到目前为止,我对解决方案的尝试

maim支持-x的古玩选项:

-x, --xdisplay=hostname:number.screen_number
Sets the xdisplay to use.

所以我尝试了maim -x 0.0 | xclip -selection clipboard -t image/png,但这不起作用。我不知道如何使用此选项,因为没有足够的文档。

scrotmaim也都支持选项-s

-s, --select
Interactively select a window or rectangle with the mouse.

所以我正在想象一个非常丑陋/黑客的解决方案,使用xdotool(或类似(来选择所需的显示器,并使用选项-smaimscrot可以完成这项工作。但我宁愿不走这条路,除非没有其他直接的解决方案。

疯狂的猜测

我想知道这个问题是否可能是因为我如何添加新显示器?我通常会添加带有如下命令的第二个显示器:

xrandr --output eDP-1 --auto --output HDMI-1-4 --auto --right-of eDP-1

所以我想知道,可能是scrotmaim只有一个显示器。我想是这样,因为带有一台显示器的xdpyinfo | grep -A4 '^screen'输出如下所示:

$ xdpyinfo | grep -A4 '^screen'
screen #0:
dimensions:    1920x1080 pixels (506x285 millimeters)
resolution:    96x96 dots per inch
depths (7):    24, 1, 4, 8, 15, 16, 32
root window id:    0x1ba

使用两台显示器看起来像这样:

$ xdpyinfo | grep -A4 '^screen'
screen #0:
dimensions:    3280x1080 pixels (865x285 millimeters)
resolution:    96x96 dots per inch
depths (7):    24, 1, 4, 8, 15, 16, 32
root window id:    0x1ba

如果这确实是导致我的问题的原因,那么我应该如何添加我的第二台显示器?

另一种解决方案是MSS。

安装非常简单(不需要昂贵的Python模块(:

$ python3 -m pip install --user -U mss

它将添加一个新的mss可执行文件,您可以随时调用。

例如,要获取每个显示器的屏幕截图,只需键入:

$ mss
/home/USER/monitor-1.png
/home/USER/monitor-2.png
/home/USER/monitor-3.png

如果只想捕获第一个监视器:

$ mss --monitor 1
/home/USER/monitor-1.png

要在一张图片中捕获所有显示器的屏幕截图(就像 scrot 所做的那样(:

$ mss --monitor -1
/home/USER/monitor-0.png

截至目前,帮助人员显示:

$ mss --help
usage: mss [-h] [-c COORDINATES] [-l {0,1,2,3,4,5,6,7,8,9}] [-m MONITOR]
[-o OUTPUT] [-q] [-v]
optional arguments:
-h, --help            show this help message and exit
-c COORDINATES, --coordinates COORDINATES
the part of the screen to capture: top, left, width,
height
-l {0,1,2,3,4,5,6,7,8,9}, --level {0,1,2,3,4,5,6,7,8,9}
the PNG compression level
-m MONITOR, --monitor MONITOR
the monitor to screen shot
-o OUTPUT, --output OUTPUT
the output file name
-q, --quiet           do not print created files
-v, --version         show program's version number and exit

使用@Arkadiusz Drabczyk非常有用的建议,我编写了一个有效的脚本。我想我会分享解决方案。

#!/bin/bash
# to have at most one instance of this script running...
script_name=${BASH_SOURCE[0]}
for pid in $(pidof -x $script_name); do
if [ $pid != $$ ]; then
kill -9 $pid
fi 
done
loc="/path/to/folder/"
# take screenshots every minute starting at next minute...
s=$((60 - $(date +%-S)))
sleep "$s"s
while true
do
f=$(date +'%Y%m%d_%H%M%S')
scrot -q 20 "$f".jpg
n=$(xrandr --listmonitors | head -n 1 | sed -e "s/Monitors: //g")
if (( n == 2 )); then
convert -crop 1920x1080 +repage "$f".jpg "$f"_%d.jpg
mv -t "$loc" "$f"_0.jpg "$f"_1.jpg
rm "$f".jpg
else
mv -t "$loc" "$f".jpg
fi
s=$((60 - $(date +%-S)))
sleep "$s"s
done

笔记:

  1. 上面的脚本比我最初要求的要多:
    • 它确保此脚本最多有一个实例正在运行(第一个代码段落(,该实例是从此堆栈溢出帖子借来的。 (正如@tripleee在评论中指出的那样,这不是一个好的做法。请注意这一点。
    • 它使用一堆sleep commands从下一分钟开始每分钟截取屏幕截图。如果您愿意,可以使用 cron-job 处理程序替换此功能。
    • 上述问题的最小解决方案将是convert -crop 1920x1090 +repage "$f".jpg "$f"_%d.jpg。(因此,如果您愿意,欢迎您去除这些膨胀(。我添加了额外的位来预测典型用法,以便人们可以按原样使用代码。
  2. 如果需要
  3. ,以下是执行其他操作的方法:
    • 您可以将1920x1080替换为左侧显示器的任何尺寸。您可以使用xrandr -q | grep " connected"找到这些维度。
    • 我的代码旨在用于固定设置,其中左侧显示器始终1920x1080。欢迎您使其更漂亮,以便它可以与任何设置一起使用。
    • 同样,我的代码旨在用于最多 2 台显示器的固定设置。再次欢迎您推广到任意数量的显示器。
    • 如果您打算进行上述概括以便它适用于任何设置,则有一条建议:是的,您需要sed/awk/grep或类似值来处理xrandr -q的输出。但请注意,xrandr -q可能是缓慢的步骤(如此处和此处所述(。但是,xrandr -q的输出不会经常更改。因此,为了制作更快的代码,您可以转储一次xrandr -q的输出,每次输出时都会更改并使用转储中的文本进行后续操作(如本答案所示(,以避免在每个循环上运行xrandr -q

希望有帮助。干杯!

相关内容

  • 没有找到相关文章

最新更新