12个稳定版本

2.5.1 2023年6月24日
2.4.0 2023年5月5日
2.3.1 2022年9月2日
2.3.0 2022年7月31日
1.1.6 2017年9月23日

#117 in GUI

MPL-2.0 许可证

28KB
586

shotgun

针对X11的最小化截图工具。Shotgun是为了替换我在工作流程中的maim而编写的。

功能

  • 将PNG截图导出到文件或标准输出
  • 遮罩多显示器设置中的屏幕外区域
  • 支持通过窗口ID和几何形状进行选择
  • 平均而言,shotgun比maim快两倍以上

用法

Usage: shotgun [options] [file]

Options:
    -i, --id ID         Window to capture
    -g, --geometry WxH+X+Y
                        Area to capture
    -f, --format png/pam
                        Output format
    -s, --screen        Capture the current screen
    -h, --help          Print help and exit
    -v, --version       Print version and exit

示例

与hacksaw一起使用:截取屏幕截图并将其复制到剪贴板

#!/bin/sh -e

selection=$(hacksaw -f "-i %i -g %g")
shotgun $selection - | xclip -t 'image/png' -selection clipboard

与slop(作为maim -s的替代)一起使用

#!/bin/sh -e

sel=$(slop -f "-i %i -g %g")
shotgun $sel "$1"

shotgun与maim比较

  • 仅支持PNG和PAM
  • 不尝试包装slop
  • 没有光标混合
  • 默认使用带时间戳的文件而不是将原始PNG数据直接输出到终端(如果要将输出重定向到其他内容,请使用-作为文件名)
  • 省略了大多数命令行标志
  • 不支持XShape扩展
  • shotgun是用Rust编写的,maim是用C++编写的
  • 代码库保持尽可能小和简单(尽可能多地在Rust允许的范围内)

省略这些功能有几个原因

  • 可以通过外部程序和包装脚本轻松替换的功能
    • 使用ImageMagick的convert和shotgun的-f pam生成JPEG输出
    • 在shell脚本中处理slop输出很简单
    • 使用sleep代替-d,因为slop需要单独调用,因此此标志不是必需的
    • -x甚至不应该存在,请使用$DISPLAY代替
  • 我从不使用光标混合,我知道大多数用户实际上并不关心它
  • -w(相对于另一个窗口的几何形状)难以使用且几乎无用,相反,shotgun始终将输入几何形状解释为相对于根窗口(maim的默认值是捕获的窗口本身)
  • 很少有理由截图XShape窗口,其中大部分都是特殊的,比如slop的选择窗口或keynav的十字准线。正确支持XShape可能会增加大量的开销,包括代码长度和性能,这些都不是我们所希望的。

性能

我声称shotgun比maim快两倍,以下是一些支持证据(使用hyperfine

$ xrandr --fb 3840x2160
$ hyperfine --warmup 15 --min-runs 50 \
>     'maim > /dev/null' \
>     'shotgun - > /dev/null'
Benchmark #1: maim > /dev/null
  Time (mean ± σ):     629.3 ms ±   3.7 ms    [User: 570.7 ms, System: 52.1 ms]
  Range (min … max):   624.8 ms … 646.7 ms    50 runs

Benchmark #2: shotgun - > /dev/null
  Time (mean ± σ):     293.0 ms ±   3.2 ms    [User: 239.6 ms, System: 52.9 ms]
  Range (min … max):   287.8 ms … 298.2 ms    50 runs

Summary
  'shotgun - > /dev/null' ran
    2.15 ± 0.03 times faster than 'maim > /dev/null'

进一步的性能分析表明,shotgun的瓶颈完全在于PNG编码器。

加快速度

可以通过使用-f pam来避免PNG编码器的瓶颈。这会将输出格式设置为Netpbm PAM - 一种未压缩的二进制图像格式。

使用未压缩的格式可以同时提高编码和解码的性能

编码

$ hyperfine --warmup 15 --min-runs 50 \
>     'shotgun -f png - > /dev/null' \
>     'shotgun -f pam - > /dev/null'
Benchmark #1: shotgun -f png - > /dev/null
  Time (mean ± σ):     294.5 ms ±   3.3 ms    [User: 240.0 ms, System: 54.1 ms]
  Range (min … max):   289.2 ms … 301.4 ms    50 runs

Benchmark #2: shotgun -f pam - > /dev/null
  Time (mean ± σ):     116.8 ms ±   2.8 ms    [User: 62.5 ms, System: 53.7 ms]
  Range (min … max):   113.8 ms … 122.7 ms    50 runs

Summary
  'shotgun -f pam - > /dev/null' ran
    2.52 ± 0.07 times faster than 'shotgun -f png - > /dev/null'

解码(使用ImageMagick转换为jpg)

$ hyperfine --warmup 15 --min-runs 50 \
>     'shotgun -f png - | convert - jpg:- > /dev/null' \
>     'shotgun -f pam - | convert - jpg:- > /dev/null'
Benchmark #1: shotgun -f png - | convert - jpg:- > /dev/null
  Time (mean ± σ):     600.7 ms ±   5.8 ms    [User: 506.4 ms, System: 96.5 ms]
  Range (min … max):   594.9 ms … 620.7 ms    50 runs

Benchmark #2: shotgun -f pam - | convert - jpg:- > /dev/null
  Time (mean ± σ):     350.4 ms ±   3.9 ms    [User: 217.0 ms, System: 139.3 ms]
  Range (min … max):   345.5 ms … 367.8 ms    50 runs

Summary
  'shotgun -f pam - | convert - jpg:- > /dev/null' ran
    1.71 ± 0.03 times faster than 'shotgun -f png - | convert - jpg:- > /dev/null'

安装

  • 从源代码安装
    • 安装一个最新的Rust工具链
    • 克隆此存储库并运行cargo install --path .
    • 或者从crates.io安装:cargo install shotgun
  • Arch Linuxpacman -S shotgun
  • Nix/NixOSnixpkgs.shotgun
  • 其他发行版:提交一个请求以添加您的软件包或构建脚本!

依赖关系

~12MB
~251K SLoC