抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

简介

截图是一个高频使用的功能,在 Linux Wayland 下有很多解决方案,如 KDE 自带的 spectacle、Flameshot 或者 snipaste 的 Linux 版本。此处我选择 spectacle 的命令行,一是该软件为 KDE 原生的截图软件,二是需要进行一些自定义的处理。

我观察到一个现象,当截图复制到内存的时候,如果直接粘贴到 LinuxQQ 中,则会在 /tmp 文件夹下产生一个临时文件,并且每次粘贴都会产生一个新的临时文件;如果是直接从文件管理器复制图片文件,则不会产生临时文件,直接贴图到编辑窗口。

通过观察两个行为的不同,我发现直接复制文件的时候是复制了一个文件路径(如 file:///tmp/screen_shot.png),LinuxQQ 解析为图片。通过 Klipper 的 DBus 输出可以发现当你复制了一个图片文件,剪贴板中保存的是一个文件路径。

1
2
3
4
# 查询 klipper 的 api
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"

# 删除旧的截图文件,确保 spectacle 生成新文件
rm -f "$SCREENSHOT_PATH"

# 运行 spectacle 截图并输出到文件,后台执行
# /usr/bin/Snipaste snip -o "$SCREENSHOT_PATH" &
spectacle -b -r -o "$SCREENSHOT_PATH" &

# 获取 spectacle 进程的PID
SNIPASTE_PID=$!

# 等待文件生成并非空
while [ ! -s "$SCREENSHOT_PATH" ]; do
sleep 0.1
done

# 等待 spectacle 完成截图并退出
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"

# 删除旧的截图文件,确保 spectacle 生成新文件
rm -f "$SCREENSHOT_PATH"

# 运行 spectacle 截图并输出到文件,后台执行
spectacle -b -a -o "$SCREENSHOT_PATH" &

# 获取 spectacle 进程的PID
SPECTACLE_PID=$!

# 等待文件生成并非空
while [ ! -s "$SCREENSHOT_PATH" ]; do
sleep 0.1
done

# 等待 spectacle 完成截图并退出
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"

# 删除旧的截图文件,确保 spectacle 生成新文件
rm -f "$SCREENSHOT_PATH"

# 运行 spectacle 截图并输出到文件,后台执行
spectacle -b -m -o "$SCREENSHOT_PATH" &

# 获取 spectacle 进程的PID
SPECTACLE_PID=$!

# 等待文件生成并非空
while [ ! -s "$SCREENSHOT_PATH" ]; do
sleep 0.1
done

# 等待 spectacle 完成截图并退出
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"

# 删除旧的截图文件,确保 spectacle 生成新文件
rm -f "$SCREENSHOT_PATH"

# 运行 spectacle 截图并输出到文件,后台执行
spectacle -b -o "$SCREENSHOT_PATH" &

# 获取 spectacle 进程的PID
SPECTACLE_PID=$!

# 等待文件生成并非空
while [ ! -s "$SCREENSHOT_PATH" ]; do
sleep 0.1
done

# 等待 spectacle 完成截图并退出
wait $SPECTACLE_PID

# 强制同步文件系统,确保文件完全写入磁盘
sync

echo "截图完成"

# 复制截图到剪贴板
echo -n "file://$SCREENSHOT_PATH" | wl-copy -t text/uri-list

echo "截图已复制到剪贴板 ✅"

更新日志

2025-04-01

  1. 更新基础内容

评论