image-stamp — 图片水印
用确定性脚本(Pillow)给图片直接加文字水印。核心原则:只加文字、越简单越好;不覆盖、可校验。
工作流程
- 拿到水印文字(必填);位置/透明度等没说就用默认,不做复杂询问。
- 调用
scripts/watermark.py --text "..."(环境准备见下)。 - 核对 JSON(字体、位置、透明度)。
- present_files 展示,汇报水印文字与输出。
参数(越少越好)
| 用途 | 参数 | 默认 |
|---|---|---|
| 水印文字(必填) | --text "XXX" | — |
| 位置 | --position:br 右下 / bl 左下 / tr 右上 / tl 左上 / center 居中 | br |
| 透明度 | --opacity 0–100 | 40 |
| 字号 | --font-size N | 短边 × 4% 自适应 |
| 颜色 | --color '#FFFFFF' | 白 |
| 自定义字体 | --font /path/to/font.ttf | 内置 Noto Sans SC |
| 多行 | --text "第一行\n第二行" | — |
| 编码兜底 | --text-file path.txt(UTF-8) | — |
明确不支持:旋转、满屏平铺、九宫格定位——保持「直接加文字」的最小心智。
字体策略(跨平台,不硬编码)
- 内置:技能自带
assets/NotoSansSC-Regular.otf(思源黑体,OFL-1.1,附 LICENSE),中文三平台一致。 - 覆盖:
--font优先于内置。 - 降级:内置字体缺失时扫描系统 CJK 字体兜底;再没有则明确报错(绝不静默出方框)。
必须遵守
- 透明度合成:RGBA overlay;输出为 JPEG 时自动白底合成并在回复告知。
- 永不覆盖:输出
原名_wm.png(保原格式),路径永不等于输入。 - 批量:多张一次传入,不循环调用。
- 动图/EXIF:GIF 只取首帧并说明;EXIF 自动摆正。
环境准备(跨平台)
同 image-split(python3 → python/py -3 → 技能目录 .venv,只依赖 Pillow)。
脚本用法
$PY <本技能目录>/scripts/watermark.py IMG1 [IMG2 ...] --text "水印文字" \
[--position br] [--opacity 40] [--font-size N] [--color '#FFFFFF'] \
[--font path.ttf] [--text-file path.txt] [--outdir DIR]
- 每张打印一行摘要 + 末尾 JSON 数组,含 {input, output, position, opacity, font}
示例:
$PY .../scripts/watermark.py photo.jpg --text "© 我的作品"
# photo.jpg -> photo_wm.jpg (text="© 我的作品", pos=br, opacity=40%, font=PingFang)
# [{"input":"photo.jpg","output":".../photo_wm.jpg","position":"br","opacity":40,"font":"PingFang.ttc"}]
完成后的动作
- present_files 展示打水印后的图
- 汇报:水印文字、位置、透明度、字体来源、输出文件
Scan to join WeChat group