图片去水印
从已存在的图片中移除水印、logo、台标、字幕、印章、时间戳和叠加文字,支持单张、多张和整个目录批量处理,并可把全部结果打包成一个 zip。
合规边界:仅用于处理使用者本人拍摄、创作或已获得授权的图片,例如清理自己素材上的旧标注、去除自己添加的台标、删除 AI 生成图自带的水印。不得用于规避他人作品的版权保护。
何时使用
- 用户提供图片,要求去水印 / 去 logo / 去台标 / 去字幕 / 去印章 / 去时间戳。
- 用户提供一批图片或一个文件夹,要求批量清洗。
- 用户说「把去完水印的图打包发我」——直接产出 zip。
- 要求"生成一张新的无水印图 / 风格重绘"时不要用本技能,改用图像生成能力。
前置条件
脚本需要两个东西:一个可用的图像擦除服务地址,和一个短期鉴权 Key。
| 环境 | 取 Key 的方式 |
|---|---|
| WorkBuddy 桌面端 | 调用内置的 connect_cloud_service,取返回里的 clientTempToken 作为 --token |
| 其他 Agent 客户端 / 自建环境 | 通过环境变量 WATERMARK_REMOVER_TOKEN 提供 Key,用 --endpoint 或 WATERMARK_REMOVER_ENDPOINT 指定兼容的服务地址 |
Key 只接受 ck_ 前缀的短期凭据。字段缺失就停下告知用户,不要用其他类型的凭据替代。
核心脚本
所有处理都走技能自带的脚本,不要临时改写去水印代码:
<SKILL_DIR>/scripts/watermark_remover.py
脚本内置:输入收集与格式过滤、4 MB 上传上限自动压缩、异步任务提交与轮询、结果下载落盘、并发控制、manifest 记录、zip 打包。它不会读写技能目录以外的任何隐私文件,不上传与本任务无关的任何数据。
执行流程
- 取得鉴权 Key(见上表)。
- 确认输入:单张图取其绝对路径;批量则取目录路径或显式列出文件。
- 判断水印位置,用户描述过就用
--region,没说就用auto。 - 运行脚本。用户要打包时加
--zip。 - 读脚本 stdout 的 JSON 摘要:
files是成品路径,zip是压缩包路径,failures是失败明细。 - 用
present_files展示成品(有 zip 优先展示 zip),并在回复里给出完整路径和成功/失败数量。
命令示例
单张图片:
python3 <SKILL_DIR>/scripts/watermark_remover.py \
--input "/absolute/path/photo.jpg" \
--output-dir "/absolute/path/watermark_removed" \
--token "<clientTempToken>"
批量 + 打包成 zip:
python3 <SKILL_DIR>/scripts/watermark_remover.py \
--input "/absolute/path/images" \
--output-dir "/absolute/path/watermark_removed" \
--zip "/absolute/path/watermark_removed/clean_images.zip" \
--concurrency 3 \
--token "<clientTempToken>"
指定水印位置(提升成功率):
python3 <SKILL_DIR>/scripts/watermark_remover.py \
--input "/absolute/path/a.png" "/absolute/path/b.png" \
--region bottom-right \
--token "<clientTempToken>"
先确认会处理哪些图,不实际调用接口:
python3 <SKILL_DIR>/scripts/watermark_remover.py --input "/absolute/path/images" --dry-run
使用案例
案例 1 · 单张商品图
输入:去水印 D:\素材\chair.jpg,水印在右下角
执行:--input D:\素材\chair.jpg --region bottom-right
输出:D:\素材\watermark_removed\chair_nowm.jpg,右下角水印被清除,背景纹理自然衔接,尺寸不变。
案例 2 · 一批图片打包
输入:把 D:\公众号配图 里所有图去水印,打完包发我
执行:--input D:\公众号配图 --zip D:\公众号配图\clean.zip --concurrency 3
输出:clean.zip 内含全部 原名_nowm.*,另有 manifest.json 记录每张图状态;失败的图会在 failures 里列出原因,不影响其他图。
案例 3 · 大图上传
输入:这张 12 MB 的图去水印
执行:脚本检测到超过 4 MB,自动缩放重压缩到限值内上传,结果里 upload_note 记录压缩幅度。
输出:成品图;若压缩仍无法达标,返回 IMAGE_TOO_LARGE 并说明原因,不伪造结果。
参数
| 参数 | 说明 |
|---|---|
--input |
必填。图片文件、目录或 glob 通配符,可多个 |
--output-dir |
输出目录,默认 ./watermark_removed |
--zip |
额外把所有成品打成一个 zip |
--region |
auto(默认)/ top-left / top-right / bottom-left / bottom-right / top / bottom / center / full |
--prompt |
追加的补充指令,会原样拼进提示词 |
--concurrency |
并发数,默认 2,上限 6 |
--poll-interval / --max-poll-time |
轮询间隔(默认 5s)与单张最长等待(默认 600s) |
--token |
短期 ck_ Key,也可用环境变量 WATERMARK_REMOVER_TOKEN |
--endpoint |
覆盖服务地址,也可用环境变量 WATERMARK_REMOVER_ENDPOINT |
--dry-run |
只列出待处理图片,不调用接口 |
规则
- 支持格式:png / jpg / jpeg / webp / bmp。gif、heic、tiff、psd 跳过并在 stderr 提示,不要硬转格式假装成功。
- 单张图必须小于 4 MB 才能上传;脚本自动缩放重压缩,压缩失败则报
IMAGE_TOO_LARGE,把原因告诉用户,不要伪造结果。 - 不自动重试。提交超时报
SUBMISSION_STATUS_UNKNOWN,任务失败报IMAGE_EDIT_FAILED,按实际错误返回。 - 输出文件名固定为
原文件名_nowm.扩展名,重名自动追加序号。 - 输出目录写
manifest.json,记录每张图的 task_id、状态、错误。 - 绝不展示、缓存或复用鉴权凭据,绝不把 Key 写进文件名、日志或回复。
- 批量部分失败时如实汇报成功数和失败原因,不要把部分成功说成全部完成。
依赖
- Python 3.7+
requests(缺失时脚本自动 pip 安装)Pillow(仅在压缩超过 4 MB 的大图时自动安装)- 接口细节见
references/service-api.md
更新记录
- 1.0.0 首次发布:单张与批量去水印、大图自动压缩、并发处理、manifest 记录、zip 打包。