简介
截图是一个高频使用的功能,在 Linux Wayland 下有很多解决方案,如 KDE 自带的 spectacle、Flameshot 或者 snipaste 的 Linux 版本。此处我选择 spectacle 的命令行,一是该软件为 KDE 原生的截图软件,二是需要进行一些自定义的处理。
我观察到一个现象,当截图复制到内存的时候,如果直接粘贴到 LinuxQQ 中,则会在 /tmp
文件夹下产生一个临时文件,并且每次粘贴都会产生一个新的临时文件;如果是直接从文件管理器复制图片文件,则不会产生临时文件,直接贴图到编辑窗口。
通过观察两个行为的不同,我发现直接复制文件的时候是复制了一个文件路径(如 file:///tmp/screen_shot.png
),LinuxQQ 解析为图片。通过 Klipper 的 DBus 输出可以发现当你复制了一个图片文件,剪贴板中保存的是一个文件路径。
1 2 3 4
| qdbus org.kde.klipper /klipper
qdbus org.kde.klipper /klipper getClipboardContents
|
原理
截图之后直接把图片保存到本地文件,然后通过命令行工具复制图片路径到剪贴板,即可实现和 GUI 中 Ctrl + C 然后 Ctrl + V 一样的效果,不会产生图片从内存写入临时文件的过程,同时这样也会加快大图片的截图贴图速度(少了临时文件的步骤)
依赖
- KDE:6.3
- wl-clipboard
- spectacle
代码
默认截图保存到 /tmp/screenshot.png
文件,可根据需要修改文件路径。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #!/bin/bash
SCREENSHOT_PATH="/tmp/screenshot.png"
rm -f "$SCREENSHOT_PATH"
spectacle -b -r -o "$SCREENSHOT_PATH" &
SNIPASTE_PID=$!
while [ ! -s "$SCREENSHOT_PATH" ]; do sleep 0.1 done
wait $SNIPASTE_PID
sync
echo "截图完成"
echo -n "file://$SCREENSHOT_PATH" | wl-copy -t text/uri-list
echo "截图已复制到剪贴板 ✅"
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #!/bin/bash
SCREENSHOT_PATH="/tmp/screenshot.png"
rm -f "$SCREENSHOT_PATH"
spectacle -b -a -o "$SCREENSHOT_PATH" &
SPECTACLE_PID=$!
while [ ! -s "$SCREENSHOT_PATH" ]; do sleep 0.1 done
wait $SPECTACLE_PID
sync
echo "截图完成"
echo -n "file://$SCREENSHOT_PATH" | wl-copy -t text/uri-list
echo "截图已复制到剪贴板 ✅"c
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #!/bin/bash
SCREENSHOT_PATH="/tmp/screenshot.png"
rm -f "$SCREENSHOT_PATH"
spectacle -b -m -o "$SCREENSHOT_PATH" &
SPECTACLE_PID=$!
while [ ! -s "$SCREENSHOT_PATH" ]; do sleep 0.1 done
wait $SPECTACLE_PID
sync
echo "截图完成"
echo -n "file://$SCREENSHOT_PATH" | wl-copy -t text/uri-list
echo "截图已复制到剪贴板 ✅"
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #!/bin/bash
SCREENSHOT_PATH="/tmp/screenshot.png"
rm -f "$SCREENSHOT_PATH"
spectacle -b -o "$SCREENSHOT_PATH" &
SPECTACLE_PID=$!
while [ ! -s "$SCREENSHOT_PATH" ]; do sleep 0.1 done
wait $SPECTACLE_PID
sync
echo "截图完成"
echo -n "file://$SCREENSHOT_PATH" | wl-copy -t text/uri-list
echo "截图已复制到剪贴板 ✅"
|
更新日志