Linux自定义Nautilus右键菜单,将任意图片转成jpeg
Linux自定义Nautilus右键菜单,将任意图片转成jpeg
今天遇到了一个问题,我用元宝生成了一个图片,我想用它时,发现它size太大了,png格式的。我想转成jpeg减少一个体积。找软件没找到合适的,于是就想到让opencode帮我给nautilus加一个右键菜单,我直接右键转换,不是很方便吗?而且这个功能在linux下应该就是几行脚本的事儿。
效果图
右键->脚本:
点击脚本名:
方法
opencode帮我干了,很简单,扔个脚本到指定目录就行了:
Nautilus 脚本机制就是这样:
脚本位置: ~/.local/share/nautilus/scripts/
工作方式:
把脚本放在这个目录下
给脚本添加执行权限 (chmod +x)
右键菜单会出现 Scripts 子菜单,里面显示所有脚本
环境变量:
NAUTILUS_SCRIPT_SELECTED_FILE_PATHS - 选中的文件路径(换行分隔)
NAUTILUS_SCRIPT_SELECTED_URIS - 选中的文件 URI
NAUTILUS_SCRIPT_CURRENT_URI - 当前目录的 URI
我们的脚本:
~/.local/share/nautilus/scripts/转换为JPEG
Nautilus 会自动扫描这个目录,不需要额外配置。脚本名就是菜单项的显示名称。
具体的脚本的内容:
#!/bin/bash
# Nautilus 脚本:将选中的图像转换为 JPEG 格式
# 存在原地,保持文件名,后缀改为 .jpeg
IFS=$'\n'
for filepath in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
# 跳过目录
[ -d "$filepath" ] && continue
# 获取目录、文件名(不含扩展名)
dir=$(dirname "$filepath")
basename=$(basename "$filepath")
name="${basename%.*}"
# 目标路径
target="$dir/$name.jpeg"
# 如果源文件已经是 jpeg,跳过
ext="${basename##*.}"
if [ "${ext,,}" = "jpeg" ] || [ "${ext,,}" = "jpg" ]; then
notify-send "跳过" "$basename 已经是 JPEG 格式" -i dialog-information
continue
fi
# 获取图片尺寸
width=$(identify -format "%w" "$filepath" 2>/dev/null)
height=$(identify -format "%h" "$filepath" 2>/dev/null)
[ -z "$width" ] && { notify-send "转换失败" "无法读取 $basename" -i dialog-error; continue; }
# 计算水印参数(自适应图片大小)
fontsize=$((width / 40))
[ $fontsize -lt 14 ] && fontsize=14
padding=$((fontsize / 2))
# 转换:清理元数据 + 压缩 + 右下角水印(覆盖原水印)
if convert "$filepath" -strip -quality 60 \
-gravity SouthEast \
-fill 'rgba(0,0,0,0.8)' -draw "rectangle $((width - fontsize * 10 - padding * 2)),$((height - fontsize - padding * 2)),$width,$height" \
-fill white -font "DejaVu-Sans" -pointsize $fontsize \
-annotate +${padding}+${padding} "https://tux.fan" \
"$target" 2>/dev/null; then
notify-send "转换成功" "$basename → $name.jpeg" -i dialog-information
else
notify-send "转换失败" "无法转换 $basename" -i dialog-error
fi
done