Linux自定义Nautilus右键菜单,将任意图片转成jpeg

更新于 2026/8/10 12:56:34

Linux自定义Nautilus右键菜单,将任意图片转成jpeg

今天遇到了一个问题,我用元宝生成了一个图片,我想用它时,发现它size太大了,png格式的。我想转成jpeg减少一个体积。找软件没找到合适的,于是就想到让opencode帮我给nautilus加一个右键菜单,我直接右键转换,不是很方便吗?而且这个功能在linux下应该就是几行脚本的事儿。

效果图

右键->脚本:
image.png

点击脚本名:
image.png

方法

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 会自动扫描这个目录,不需要额外配置。脚本名就是菜单项的显示名称。

具体的脚本的内容:

bash
#!/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