图片加水印
官方脚本
可调用节点
v1.4.1
图片批量加水印 | 文字/图片水印、字体字号颜色描边、透明度/旋转/九宫格定位/平铺、实时预览、多图批量、输出目录与后缀可配置 | 支持右键/快捷键/卡片触发,可被其他脚本联动调用
脚本能力
直接启动支持
右键启动支持
快捷键启动支持
超级复制启动不支持
定时任务不支持
可被其他脚本调用是
依赖其他脚本否
图形化启动界面不支持
为图片添加文字或图片水印,支持平铺、旋转、九宫格定位,多图批量处理,可输出到指定目录或源图片目录。
核心特性
- 两种水印类型:文字水印、图片水印(Logo)
- 文字水印可定制:字体、字号、颜色、描边颜色与宽度;中文自动回退到系统 CJK 字体,不会出现方块
- 图片水印可缩放:按原图宽度比例调整 Logo 大小
- 通用参数:透明度、旋转角度(-180°~180°)、九宫格定位、平铺模式
- 实时预览:缩略图快速切换,调整参数即时看到效果
- 多图批量:一次性添加多张图片,点「确定添加水印」统一处理
- 输出位置可选:留空则输出到各图源目录;也可指定统一输出目录
- 输出命名固定:输出为
原名_watermarked.png(PNG 格式) - 配置自动记忆:水印参数与输出设置自动保存,下次打开沿用
- 离线可用:界面与渲染全部本地完成,无任何外部依赖
脚本演示

安装方法
本脚本的运行环境、依赖组件及图形化窗口均依赖「不忙脚本盒子」,建议仅通过盒子安装和使用。
前置条件:安装好 不忙脚本盒子
- 打开盒子 → 脚本市场 → 搜索 「图片加水印」
- 点击「安装」,等待安装完成
使用方式
-
打开窗口(任意方式都会弹出配置窗口)
- 在盒子主界面点击「图片加水印」卡片
- 在盒子「热键管理」为该脚本绑定快捷键后按下
- 在文件夹中选中图片 → 右键 → 不忙脚本盒子 → 图片加水印
-
添加图片(三选一,可混合)
- 点「添加图片」:打开系统文件对话框,可多选(记住源目录)
- 点「选择图片」:用系统文件选择器多选
- 直接把图片拖进预览区
-
设置水印
- 选择「文字水印」或「图片水印」;文字可设置内容、字体、字号、颜色、描边;图片可「选择水印图片」并调整大小
- 设置透明度、旋转角度、位置(九宫格)、是否平铺,右侧实时预览
-
输出
- 输出目录:留空则保存到每张图片所在目录;也可点「浏览」指定统一目录
- 输出文件名固定为
原名_watermarked.png - 点「确定添加水印」,逐张处理并显示进度
-
完成
- 全部成功:提示「已输出 N 张」,窗口自动关闭
- 有失败:窗口保留并显示失败原因,便于调整后重试
🔗 作为节点被调用(脚本联动)
本脚本已声明为节点([bmscriptsbox.node] enabled = true),可被其他脚本通过 /api/link 同步调用:不弹窗口、不等待输入,静默处理并把结果写入信封。
- 输入:
target_paths(图片路径数组) -
运行参数
参数 类型 默认 说明 typestr text 水印类型: text/imagetextstr © BmScriptsBox 文字水印内容 font_sizeint 48 字号(px) colorstr #ffffff 文字颜色 opacityfloat 0.7 透明度(0.1~1) rotationint 0 旋转角度(-180~180) positionstr c 九宫格位置 nw/n/ne/w/c/e/sw/s/setilebool false 是否平铺 image_pathstr 空 图片水印文件路径 scaleint 20 图片水印占原图宽度百分比 output_dirstr 空 输出目录;留空则输出到源目录 suffixstr _watermarked 输出文件名后缀 -
输出(信封)
键 类型 说明 codeint 0 成功;非 0 失败 msgstr 结果说明 fileslist 处理成功的输出文件路径列表 countint 处理成功的数量
调用示例(调用方脚本):
import json, sys, requests
env = json.load(open(sys.argv[1], encoding='utf-8'))['environment']
r = requests.post(f"{env['api_base']}/api/link", json={
"script_id": "c8f3e2a1-3d4b-5c6d-7e8f-9a0b1c2d3e4f", # 本脚本 id
"data": {"target_paths": ["C:/a/photo.jpg"]},
"params": {"type": "text", "text": "© MyApp", "position": "se", "output_dir": "C:/out"},
}, timeout=3600)
result = r.json()["result"]
if result.get("code") != 0:
raise RuntimeError(result.get("msg"))
print(result["files"]) # 输出文件路径列表
修改 TOML 后需在盒子中重新安装 / 更新本脚本,节点声明才会生效。
💡 使用提示
- 通过右键/快捷键触发时,已在文件管理器中选中的图片会自动带入窗口。
- 拖拽添加的图片拿不到源目录,若「输出目录」留空将无法保存,请先指定输出目录。
- 选中的水印图片会被复制并统一转存为 PNG 到
%USERPROFILE%\.image-marker\watermark.png。 - 水印文字留空时不绘制文字水印(图片水印加载失败时会自动回退为默认文字)。
- 中文水印:渲染时若所选字体不含中文字形,会自动改用系统 CJK 字体(Microsoft YaHei / Noto Sans SC / SimHei / SimSun 等),不会出现方块。
🖥️ 环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10 1803+(64 位) |
| 运行环境 | Node.js >= 16(盒子自动下载) |
| 外部工具 | webview-cli(盒子自动下载) |
| 运行依赖 | @napi-rs/canvas(盒子自动安装) |
更新日志
- v1.4.1(当前最新版)
- 修复中文水印渲染成方块:渲染时按文本内容自动回退系统 CJK 字体
- 修复水印图片与目标图的 Content-Type 与实际格式不符:水印图统一转存为 PNG,目标图按扩展名返回正确类型
- 统一空文字水印语义:留空即不绘制(预览与输出一致)
- 字体下拉新增中文选项(Microsoft YaHei / Noto Sans SC / SimHei / SimSun / Microsoft JhengHei)
- 移除界面上的「文件名后缀」输入(固定
_watermarked,节点调用仍可用suffix参数)
本脚本已声明为节点,可被其他脚本通过「不忙脚本盒子」机制调用。完整配置见下方 TOML,其他脚本若需调用请严格按此配置构造请求。
bm-scripts-box-rc.toml
[bmscriptsbox]
[bmscriptsbox.info]
id = "c8f3e2a1-3d4b-5c6d-7e8f-9a0b1c2d3e4f"
name = "图片加水印"
desc = "图片批量加水印 | 文字/图片水印、字体字号颜色描边、透明度/旋转/九宫格定位/平铺、实时预览、多图批量、输出目录与后缀可配置 | 支持右键/快捷键/卡片触发,可被其他脚本联动调用"
version = "1.4.1"
icon = "./imgs/logo.png"
[bmscriptsbox.runtime]
language = "node.js"
language_version = ">=v16.0"
entry = "main.js"
terminal = "never"
binaries = [{name = "webview-cli"}]
[bmscriptsbox.triggers.context_menu]
enabled = true
targets = ["files"]
filters = [".png", ".jpg", ".jpeg", ".gif", ".bmp", ".webp"]
[bmscriptsbox.triggers.shortcut]
enabled = true
input_type = "files"
filters = [".png", ".jpg", ".jpeg", ".gif", ".bmp", ".webp"]
[[bmscriptsbox.inputs]]
name = "target_paths"
label = "图片"
type = "list"
exts = [".png", ".jpg", ".jpeg", ".gif", ".bmp", ".webp"]
description = "要添加水印的图片文件"
[[bmscriptsbox.outputs]]
name = "files"
type = "list"
description = "处理成功后的输出文件路径列表"
[[bmscriptsbox.outputs]]
name = "count"
type = "str"
description = "成功处理的数量"
[[bmscriptsbox.params]]
name = "type"
label = "水印类型"
type = "str"
default = "text"
choices = ["text", "image"]
choice_labels = { text = "文字", image = "图片" }
required = false
description = "水印类型:text 文字 / image 图片"
[[bmscriptsbox.params]]
name = "text"
label = "水印文字"
type = "str"
default = "© BmScriptsBox"
required = false
description = "文字水印内容"
[[bmscriptsbox.params]]
name = "font_size"
label = "字号"
type = "int"
default = 48
required = false
description = "文字水印字号(px)"
[[bmscriptsbox.params]]
name = "color"
label = "文字颜色"
type = "str"
default = "#ffffff"
required = false
description = "文字水印颜色,如 #ffffff"
[[bmscriptsbox.params]]
name = "opacity"
label = "透明度"
type = "float"
default = 0.7
required = false
description = "水印透明度,0.1 ~ 1"
[[bmscriptsbox.params]]
name = "rotation"
label = "旋转角度"
type = "int"
default = 0
required = false
description = "水印旋转角度,-180 ~ 180"
[[bmscriptsbox.params]]
name = "position"
label = "位置"
type = "str"
default = "c"
choices = ["nw", "n", "ne", "w", "c", "e", "sw", "s", "se"]
required = false
description = "九宫格位置:nw/n/ne/w/c/e/sw/s/se"
[[bmscriptsbox.params]]
name = "tile"
label = "平铺"
type = "bool"
default = false
required = false
description = "是否将水印平铺整张图片"
[[bmscriptsbox.params]]
name = "image_path"
label = "水印图片路径"
type = "str"
default = ""
required = false
description = "图片水印的文件路径(type=image 时使用)"
[[bmscriptsbox.params]]
name = "scale"
label = "水印大小"
type = "int"
default = 20
required = false
description = "图片水印占原图宽度的百分比"
[[bmscriptsbox.params]]
name = "output_dir"
label = "输出目录"
type = "str"
default = ""
required = false
description = "输出目录;留空则输出到各图片源目录"
[[bmscriptsbox.params]]
name = "suffix"
label = "文件名后缀"
type = "str"
default = "_watermarked"
required = false
description = "输出文件名后缀,如 _watermarked"
[bmscriptsbox.node]
enabled = true
评论