用 Google Gemini 生图之后,右下角会出现一枚半透明的星形水印。如果只是自己看看,无所谓;但如果要拿来做演示文稿、设计草图或者社交媒体配图,这块水印就很碍事。
大多数人的第一反应是找个修图工具"擦掉"它。但 Gemini 这个水印有一个特殊之处:它不是随机贴上去的涂鸦,而是一个固定模式、固定位置、按数学公式叠加上去的半透明图层。既然加上去的方式是确定的,去掉它的方式也可以是确定的——不需要 AI 猜,用反向公式算就行。
这篇文章拆解一下这个过程的原理,帮你判断什么时候能用、什么时候不能用。
Gemini 的水印到底是怎么加上去的
Gemini 的可见水印使用的是标准的 Alpha 混合(Alpha Compositing)。这不是什么黑科技,而是图形学里最基础的透明度合成公式:
watermarked = α × logo + (1 - α) × original
其中:
watermarked是你最终看到的带水印像素值original是水印下面被覆盖的原始像素值logo是水印图案的颜色(Gemini 的星形水印是白色,即 255)α是水印在该像素位置的透明度(0 到 1 之间)
简单说:每个像素的最终颜色 = 水印颜色 × 透明度 + 原图颜色 × (1 - 透明度)。透明度越高,水印越明显,原图信息被"压"得越多。
这个过程有两个关键特征:
- 水印图案是固定的——每张 Gemini 生成图上的星形水印长得一样。
- 透明度分布是固定的——同尺寸水印在每个像素位置的 α 值不变。
这意味着只要有人把这个 α 分布图(Alpha Map)逆向出来,就能建立一套精确的反向公式。
反向 Alpha 混合:从数学上"算回"原图
知道了加水印的公式,反过来解方程就行:
original = (watermarked - α × logo) / (1 - α)
这是 Allen Kuo 在他的逆向研究中提出的核心思路。他通过在纯色背景上捕获水印图案,反推出完整的 Alpha Map,然后把公式应用到每一个被水印覆盖的像素上。
这套方法和"AI 修图"有本质区别:
| 反向 Alpha 混合 | AI 修图(Inpainting) | |
|---|---|---|
| 原理 | 数学公式精确反解 | 模型"猜测"被遮挡区域 |
| 精度 | 像素级精确,误差极小 | 取决于模型能力,可能出错 |
| 速度 | 毫秒级 | 秒到分钟级 |
| 适用范围 | 仅限已知 Alpha Map 的固定水印 | 可尝试任意遮挡修复 |
| 失败模式 | α 不准时会出现色块 | 可能产生不自然纹理 |
一句话区别
反向 Alpha 混合是在"还原"——算出被覆盖的原始像素;AI 修图是在"补"——猜一个看起来合理的替代。
还原效果取决于什么条件
反向公式在理想条件下是精确的,但实际使用中效果好不好,取决于输入图片的状态:
效果最好的情况:
- 直接从 Gemini 导出的原始 PNG(未经任何处理)
- 图片没有被截图、缩放、重新压缩过
- 水印区域下方的原始内容不是纯白或极接近白色
效果可能受影响的情况:
- 图片经过了社交平台的压缩(微信、微博等会重新编码)
- 图片被截图工具保存过(可能引入缩放或色彩空间变化)
- 水印区域正好覆盖在接近纯白的背景上(α 接近 1 的位置信息损失大)
完全不适用的情况:
- 非 Gemini 来源的水印(不同工具的 Alpha Map 不同)
- Google 的 SynthID 隐写水印(嵌入在频域,不是可见图层叠加)
- 图片被深度修改过,水印区域已经和原始不一致
SynthID 和可见水印是两回事
Gemini 图片可能同时包含可见水印(右下角星形)和 SynthID 不可见水印。反向 Alpha 混合只处理可见的部分,SynthID 是完全不同的技术路线。
Gemini 水印的两种常见尺寸
根据 开源仓库 的实测数据,Gemini 目前使用两种水印尺寸:
- 48×48 像素:出现在较小分辨率的生成图上
- 96×96 像素:出现在较大分辨率的生成图上
两者的 Alpha Map 图案相同(都是四角星形),但边距和缩放不一样。正确识别尺寸是精确去除的关键——如果用错了 Alpha Map,反向计算的结果会出现明显色偏。
我们的 Gemini 水印去除工具 会自动检测水印尺寸并匹配对应的 Alpha Map,不需要用户手动选择。
自己动手:原理并不复杂
如果你是开发者,想自己实现或者理解底层逻辑,核心代码并不多。整个过程可以拆成三步:
第一步:加载 Alpha Map
Alpha Map 记录了水印图案中每个像素的透明度值。它可以通过在纯黑背景上截取水印来校准:如果纯黑(0)上显示的值是 v,那 α = v / 255。
第二步:定位水印区域
Gemini 的水印固定在图片右下角,距离边缘有固定的 margin。知道 margin 和水印尺寸,就能算出水印覆盖的精确区域。
第三步:逐像素反向计算
对水印区域内的每个像素,用反向公式还原:
// 对 R、G、B 三个通道分别计算
for (let ch = 0; ch < 3; ch++) {
const watermarked = imageData[pixelIndex + ch];
const alpha = alphaMap[mapIndex];
const logo = 255; // 白色水印
// 反向 Alpha 混合
const original = (watermarked - alpha * logo) / (1 - alpha);
// 限制到有效范围
imageData[pixelIndex + ch] = Math.round(
Math.max(0, Math.min(255, original))
);
}完整实现可以参考我们的 开源仓库,里面包含了 Alpha Map 文件、双尺寸自动检测逻辑、Web Worker 并行处理,以及 Tampermonkey 用户脚本。
为什么这个操作可以在浏览器里完成
反向 Alpha 混合的计算量很小——本质上就是对几千个像素做一次加减乘除。不需要 GPU,不需要模型推理,一个普通的 JavaScript 线程就能在几十毫秒内跑完。
利用 Web Worker 做多线程处理后,即使批量处理几十张图,也只需要秒级。这就是为什么这件事可以做成纯前端工具,不需要上传到服务器——计算发生在你自己的浏览器里,图片不离开你的设备。
这对处理未公开的设计稿、商业素材或内部方案图来说,隐私上比较安心。
实际使用建议
根据不同场景,这里给几个实际建议:
处理 Gemini 直出的 PNG
这是最理想的输入。直接拖进 工具页 就能得到干净结果,通常肉眼看不出水印痕迹。
处理从聊天记录中保存的图片
如果你是在 Gemini 对话页面右键"另存为"得到的图片,通常也没问题。但如果用的是截图工具,图片可能经历了缩放或色彩空间转换,效果会打折。
处理被转发过的图片
经过微信、Telegram 等平台压缩后的图片,水印区域的像素值已经被重新编码。反向公式可能仍能改善观感,但无法做到完美还原。
批量处理
工具支持一次拖入多张图片批量处理。但建议先拿一两张试验效果,确认输入条件合适后再大批量操作。
如果你遇到的不是 Gemini 水印,而是其他来源的图片水印,可以参考 图片去水印技术路径全解析,了解从传统算法到扩散模型的完整方案对比。
技术归因与使用边界
反向 Alpha Blending 方法来自 Allen Kuo 的 原始研究 和他的 Gemini Watermark Tool(MIT 许可)。我们的 开源仓库 是在此基础上的 JavaScript 移植与产品化实现。
使用层面需要注意:这个工具面向个人和教育用途。去除水印可能涉及平台规则或版权问题,请根据你所在地区的法律和使用场景自行判断。
