Sun 27 Sep 2015 12:09:43 AM CST

scrot 是一个轻量级的屏幕截图程序,它的功能很简单,但都很实用。它的选项很容易看懂。

不指定输出文件时,默认输出文件格式是 "%Y-%m-%d-%H-%M-%S_$wx$h.png",就是 年-月-日-时-分-秒_宽x高.png 。其中以%开头的变量是strftime,在C库函数中也是通用的,date命令也遵循同样的格式。而$符号开头的变量则是scrot自己内部定义的,另外比较有用的一个是 $f,代表整个文件名,可以用这个变量对截好的图进行下一步操作。

有时候,可能希望在敲完命令,对窗口做一些改动后再开始截图,于是 -d 选项就很有用了。

$ scrot -u -d 2 -c # 因为在终端输命令的时候肯定焦点在终端上啦,所以希望延迟几秒好有时间把焦点转移到要截图的窗口

还可以用 import 命令,首先要获得活动窗口的id:

#!/bin/sh
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}
import -window "$activeWinId" /tmp/$(date +%F_%H%M%S_%N).png

我现在是用i3-dmenu-desktop(其实是j4-dmenu-desktop)来启动程序,但是 scrot 是没有.desktop文件的,需要手动生成。 * 生成 scrot.desktop 文件(/usr/share/applications/scrot.desktop)

[Desktop Entry]

Name=Scrot
Comment=Take screen shots
Exec=scrot -e "mv \$f ~/Pictures/Screenshots/"
Terminal=false
Type=Application

注意比较坑的一点是,直接在shell中执行时,-e 后面的命令需要用单引号包含,因为双引号会让bash展开例如说 $fscrot 的内部变量。但在.desktop文件里不会去解析双引号,而且好像必须要用双引号才行。另外dollar符号要进行转义。这个试了好多遍才做对,还查了freedesktop上的官方文档 The Exec Key

最后有一个没有解决的问题是,我现在有两块显示屏,scrot 默认是同时截取所有的屏幕,然后合成一个大文件。这个大文件当然不可能在任何一个单独的屏幕上完全显示!而且如果两块屏幕分辨率是不一样的,最终合成的图片看着也很别扭。

我目前还不知道如何单独截取一个屏幕(想到了给scrot指定 DISPLAY变量,但是在两块屏幕上这两个变量都是一样的。)

#!/bin/sh
xdpyinfo -ext XINERAMA | sed '/^  head #/!d;s///' |
while IFS=' :x@,' read i w h x y; do
        import -window root -crop ${w}x$h+$x+$y head_$i.png
done
#  head #0: 1920x1080 @ 1280,0
#  head #1: 1280x1024 @ 0,0

其原理是对默认截下来的所有屏幕的拼接图片进行剪裁,通过给 import 的-crop选项指定参数,因为第一块屏幕是左上角坐标为(1280,0),宽高是1920x1080,那么参数就应为1920x1080+1280+0。