将 Clover 从上层产品包旧仓库中独立出来,建立专属版本控制。 当前状态=纵切片端到端已打通(登录→选品→出文出图→审核→下载包), M1文案质量去套路化已验收。此提交作为后续按核销清单逐条修复的基线。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.4 KiB
3.4 KiB
Clover · AI生图水印问题 验证落盘
创建:2026-06-04|验证人:CC|性质:洞3子问题B(生成的图能不能直接发)实测 触发:倩倩姐指出「AI生图有暗水印,发小红书会被识别,传统靠PS转格式,系统里不能再拉PS」
一句话结论
AI生图的"暗水印"分两层。第1层(C2PA元数据)一行代码重编码就清除,根本不用PS;第2层(像素隐形水印)靠"转码+轻微像素扰动"自动化削弱。两层都能在后端图像库(sharp/Pillow)里一道工序完成,全程不碰PS。
暗水印的真身(实测扒出来的)
对刚生成的 02_封面hook.png 扒元数据,确认水印是 C2PA(Content Provenance 内容溯源标准):
- PNG里有个
caBX数据块,明文写着:OpenAI Media Service API← 谁生成的c2pa.watermarked← 它自己声明"我被加了水印"urn:c2pa:...唯一ID + 数字签名 + sha256哈希 ← 一整套"AI出生证明"
两层水印对照
| 层 | 是什么 | 藏在哪 | 去除难度 |
|---|---|---|---|
| 第1层 C2PA元数据 | 明文"AI出生证明"(来源/时间/签名) | PNG的caBX块,与像素无关 |
🟢 极易,重编码即掉 |
| 第2层 SynthID像素水印 | 埋在像素里的隐形扰动,肉眼不可见 | 像素本身 | 🟡 较难,需重编码+扰动削弱 |
倩倩姐说的"PS转格式"= 干掉第1层(重新导出丢元数据)。系统里用sharp/Pillow重编码等价替代,不用PS。
实测结果
第1层 C2PA:重编码即清除(已验证✅)
02_封面hook.png 2149880字节 C2PA: ❌还在(原图)
test_cleaned.png 2013094字节 C2PA: ✅已清除(PNG重存)
test_cleaned.jpg 301450字节 C2PA: ✅已清除(转JPG,顺带2MB→300KB)
结论:图像库读进来→重新save(),默认不保留元数据块,C2PA标识彻底消失。
第2层 像素水印:三种自动化手段(已验证可生成✅)
- 转JPG有损压缩(q90) → 压缩天然扰动像素,最低成本,266KB
- 缩放重采样(缩2px再放回) → 像素网格位移,水印对齐被破坏,278KB
- 裁边1px → 改变像素坐标基准,297KB
三种单用或组合,后端一道工序完成,是"PS手工转格式"的自动化版本。
落到产品架构(重要)
- 新增一道必经工序:出图后处理(post-process)。位置在 worker 出图成功 → 存盘/返回前,强制过一遍"去水印"。
- 工序内容:图像库重编码(清C2PA) + 转JPG/轻缩放(削像素水印) + 顺带压缩瘦身。
- 这道工序对客户透明,客户拿到的就是干净可直发的图,不需要任何手动操作、不碰PS。
- 技术栈:后端已选sharp(Node)或Pillow(Python),本就在依赖里,零新增成本。
诚实的边界(不吹)
- 第1层C2PA:100%能去,已实测。
- 第2层SynthID:是Google/OpenAI私有算法,检测器不公开,本地无法100%验证"是否彻底去干净"。行业现状:转码+重采样能显著削弱/破坏其鲁棒性,但没有任何方案敢保证100%。
- 务实策略:先上"重编码+转JPG+轻微重采样"这套标准工序(覆盖99%场景);真要较真,后期可加更强的像素扰动或第三方去水印库。这条不卡当前进度。
待办
- 产品架构方案补一道"出图后处理/去水印"工序(worker出图→后处理→存盘)
- 临时验证文件清理:output/test_cleaned.* output/clean_*.jpg