本站一直使用着自建EasyImages图床,提供了上传图片的API接口。在此基础上,我结合插件,一直使用饱受赞誉的PicGo作为写作时上传图片的工具。
但是,在我的Wayland桌面上,这个软件总是存在着一些小问题。首先是图片的WebP压缩支持似乎并不良好,需要使用插件,倒是有多个开发者维护的不同版本的插件,但它们质量差异大,效果也不太符合我的标准,同时也无法自定义压缩质量参数。其次PicGo的插件安装本应是很便捷的搜素-安装的,可是在我的电脑上,即使挂着梯子也无法直接在应用内搜索安装,只能上网搜索,在Github上找到后下载、解压、安装,再就是图片上传后不能自动复制链接,作为Electron软件,它在后台的资源占用也很大。
我本来一直忍受着,可是在换了新设备后,终于,在我的新电脑上,这一套行不通了。于是我干脆自己动手,丰衣足食,抛开PicGo,在KDE右键菜单中实现如图的一键上传功能。
这就是最终的效果:

简而言之,目前的版本实现了如下效果,完美符合我的需求:
- 上传图片前使用ImageMagick压缩为WebP(可自定义压缩参数)
- 压缩后图片本地留档
- 可以在KDE右键菜单一键上传,与系统深度整合
- 图片上传后自动复制Markdown格式链接
- 呈现系统通知,包含原始图片链接,压缩前后的大小
- 支持从CLI和GUI两种界面上传图片
- 无后台守护进程,上传图片时才调用,无前端,资源占用小
具体脚本:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
API_URL="请替换成你自己的图床地址" TOKEN="请通过后台获取" COMPRESSED_DIR="/home/micraow/Pictures/compressed" MAX_DIMENSION="2400" WEBP_QUALITY="80"
format_size() { local bytes=$1 if (( bytes < 1024 )); then echo "${bytes}B" elif (( bytes < 1048576 )); then printf "%.1fK\n" $(echo "scale=1; $bytes/1024" | bc) else printf "%.1fM\n" $(echo "scale=1; $bytes/1048576" | bc) fi }
for cmd in magick curl jq bc notify-send; do if ! command -v $cmd &> /dev/null; then echo "错误: 命令 '$cmd' 未找到。请先安装。" exit 1 fi done
if ! command -v wl-copy &> /dev/null && ! command -v xclip &> /dev/null; then echo "错误: 未找到剪贴板工具。请安装 'wl-clipboard' (推荐) 或 'xclip'。" exit 1 fi
if [ -z "$1" ]; then echo "用法: $0 <图片路径>" exit 1 fi INPUT_IMAGE="$1" if [ ! -f "$INPUT_IMAGE" ]; then echo "错误: 文件 '$INPUT_IMAGE' 不存在。" notify-send "上传失败" "文件 '$INPUT_IMAGE' 不存在" -i dialog-error exit 1 fi
mkdir -p "$COMPRESSED_DIR" FILENAME=$(basename -- "$INPUT_IMAGE") BASENAME="${FILENAME%.*}" OUTPUT_WEBP="$COMPRESSED_DIR/${BASENAME}.webp"
echo "--- 开始处理图片 ---" ORIGINAL_SIZE=$(stat -c%s "$INPUT_IMAGE") ORIGINAL_SIZE_HR=$(format_size $ORIGINAL_SIZE) echo "原始文件: $INPUT_IMAGE ($ORIGINAL_SIZE_HR)"
echo "正在转换并压缩..." magick "$INPUT_IMAGE" -resize "${MAX_DIMENSION}x${MAX_DIMENSION}>" -quality "$WEBP_QUALITY" "$OUTPUT_WEBP"
if [ $? -ne 0 ]; then echo "错误: 图片处理失败。" notify-send "上传失败" "使用ImageMagick处理图片时出错" -i dialog-error exit 1 fi
COMPRESSED_SIZE=$(stat -c%s "$OUTPUT_WEBP") COMPRESSED_SIZE_HR=$(format_size $COMPRESSED_SIZE) PERCENTAGE=$(echo "scale=2; ($COMPRESSED_SIZE * 100) / $ORIGINAL_SIZE" | bc) printf "压缩后大小: %s (原始的 %.2f%%)\n" "$COMPRESSED_SIZE_HR" "$PERCENTAGE"
echo "--- 开始上传图片 ---" RESPONSE=$(curl -s -X POST "$API_URL" -F "image=@$OUTPUT_WEBP" -F "token=$TOKEN")
if echo "$RESPONSE" | jq -e '.result == "success"' > /dev/null; then UPLOADED_URL=$(echo "$RESPONSE" | jq -r '.url') MARKDOWN_LINK=""
if command -v wl-copy &>/dev/null && [ -n "$WAYLAND_DISPLAY" ]; then echo -n "$MARKDOWN_LINK" | wl-copy elif command -v xclip &>/dev/null; then echo -n "$MARKDOWN_LINK" | xclip -selection clipboard fi
echo "" echo "✅ 上传成功!" echo "----------------------------------------" echo "图片链接: $UPLOADED_URL" echo "Markdown: $MARKDOWN_LINK" echo "----------------------------------------" echo "Markdown 链接已复制到剪贴板!"
NOTIFY_BODY="大小: $ORIGINAL_SIZE_HR → $COMPRESSED_SIZE_HR\n链接: $UPLOADED_URL\n\n(Markdown已复制)" notify-send "图片上传成功" "$NOTIFY_BODY" -i "network-transmit-receive"
else ERROR_MSG=$(echo "$RESPONSE" | jq -r '.result // "未知错误"') echo "❌ 上传失败。" echo "服务器返回信息: $RESPONSE" notify-send "图片上传失败" "服务器返回: $ERROR_MSG" -i "dialog-error" exit 1 fi
|
(没错,这么复杂的shell脚本又是Gemini帮我写的)
这个脚本实现了图片上传与反馈的主要逻辑,将其保存至/usr/local/bin/upload,然后就可以在终端以upload <文件路径>的命令上传图片了,效果如下:

其实现在已经很方便了,因为直接把文件拖入终端就会输入文件位置,就像PicGo的图片拽到窗口上传。
桌面集成(仅KDE Plasma适用)
程序员遇到重复三次以上的事情,就应该考虑用脚本自动化
作为CS新人,咱们也要学会这种懒高效率的工作方式。其实我觉得最自然的调用方式是应该像题图一样,选中图片,右键上传:

所以现在要考虑如何向我的KDE Plasma桌面注册“我可以操作图片”的信息,这样在Dolphin里才能直接上传图片。
双子星,闪耀!
1 2 3 4 5 6 7 8 9 10 11 12
| [Desktop Entry] Type=Service ServiceTypes=KonqPopupMenu/Plugin
MimeType=image/jpeg Actions=uploadImage
[Desktop Action uploadImage] Name[zh_CN]=上传到我的图床 Name=上传到我的图床 Icon=network-transmit-receive Exec=/bin/bash /usr/local/bin/upload %f
|
请保存至~/.local/share/kio/servicemenus/upload-action.desktop随后运行:
1
| kbuildsycoca6 --noincremental
|
再打开一个Dolphin窗口,你会发现,有了!
🫠
这下写作的工作流更顺畅了,也更愿意在文章里配图了()
不得不说linux在自定义、功能编排这一块还是很出色的,同样的功能想要在Windows上实现至少要新建个软件项目,在linux上却可以通过连接各种cli工具实现,这一优势在AI的加持下愈发明显。普通人只需要描述想法,AI就能给出还算可靠的脚本。安装几个必须的包就能把很多事情自动化。