gemini_watermark_cleaner/README_zh.md

6.5 KiB
Raw Blame History

English

Gemini 无损去水印工具 - banana.ovo.re

基于 Javascript 的纯浏览器端 Gemini AI 图像无损去水印工具,使用数学精确的反向 Alpha 混合算法

特性

  • 纯浏览器端处理 - 无需后端服务器,所有处理在本地完成
  • 隐私保护 - 图片不会上传到任何服务器
  • 数学精确 - 基于反向 Alpha 混合算法,非 AI 模型
  • 自动检测 - 自动识别 48×48 或 96×96 水印尺寸
  • 易于使用 - 拖拽选择图片,一键处理
  • 跨平台 - 支持所有现代浏览器

效果示例

点击查看/收起示例  
原图 去水印后

⚠️ 使用需注意

使用此工具产生的风险由用户自行承担

本工具涉及对图像数据的修改。尽管在设计上力求处理结果的可靠性,但由于以下因素,仍可能产生非预期的处理结果:

  • Gemini 水印实现方式的更新或变动
  • 图像文件损坏或使用了非标准格式
  • 测试案例未能覆盖的边界情况

作者对任何形式的数据丢失、图像损坏或非预期的修改结果不承担法律责任。使用本工具即代表您已了解并接受上述风险。

使用方法

  1. 在浏览器中打开 index.html
  2. 拖拽或点击选择带水印的 Gemini 图片
  3. 图片会自动开始处理,移除水印
  4. 下载处理后的图片

算法原理

Gemini 添加水印的方式

Gemini 通过以下方式添加水印:

watermarked = \alpha \cdot logo + (1 - \alpha) \cdot original

其中:

  • watermarked: 带水印的像素值
  • α: Alpha 通道值 (0.0-1.0)
  • logo: 水印 logo 的颜色值(白色 = 255
  • original: 原始像素值

反向求解移除水印

为了去除水印,可以反向求解如下:

original = \frac{watermarked - \alpha \cdot logo}{1 - \alpha}

通过在纯色背景上捕获水印,我们可以重建 Alpha 通道,然后应用反向公式恢复原始图像

水印检测规则

图像尺寸条件 水印尺寸 右边距 下边距
宽 > 1024 高 > 1024 96×96 64px 64px
其他情况 48×48 32px 32px

项目结构

gemini-watermark-web/
├── index.html              # 主页面
├── css/
│   └── style.css          # 样式文件
├── js/
│   ├── core/
│   │   ├── alphaMap.js    # Alpha map 计算
│   │   ├── blendModes.js  # 反向 alpha 混合算法
│   │   └── watermarkEngine.js  # 主引擎
│   ├── assets/
│   │   ├── bg-capture-48.png  # 48×48 水印背景
│   │   └── bg-capture-96.png  # 96×96 水印背景
│   └── app.js             # UI 交互逻辑
└── README.md

核心模块

alphaMap.js

从背景捕获图像计算 Alpha 通道:

export function calculateAlphaMap(bgCaptureImageData) {
    // 提取 RGB 通道最大值并归一化到 [0, 1]
    const alphaMap = new Float32Array(width * height);
    for (let i = 0; i < alphaMap.length; i++) {
        const maxChannel = Math.max(r, g, b);
        alphaMap[i] = maxChannel / 255.0;
    }
    return alphaMap;
}

blendModes.js

实现反向 Alpha 混合算法:

export function removeWatermark(imageData, alphaMap, position) {
    // 对每个像素应用公式original = (watermarked - α × 255) / (1 - α)
    for (let row = 0; row < height; row++) {
        for (let col = 0; col < width; col++) {
            const alpha = Math.min(alphaMap[idx], MAX_ALPHA);
            const original = (watermarked - alpha * 255) / (1.0 - alpha);
            imageData.data[idx] = Math.max(0, Math.min(255, original));
        }
    }
}

watermarkEngine.js

主引擎类,协调整个处理流程:

export class WatermarkEngine {
    async removeWatermarkFromImage(image) {
        // 1. 检测水印尺寸
        const config = detectWatermarkConfig(width, height);

        // 2. 获取 alpha map
        const alphaMap = await this.getAlphaMap(config.logoSize);

        // 3. 移除水印
        removeWatermark(imageData, alphaMap, position);

        return canvas;
    }
}

浏览器兼容性

  • Chrome 90+
  • Firefox 88+
  • Safari 14+
  • Edge 90+

需要支持:

  • ES6 Modules
  • Canvas API
  • Async/Await
  • TypedArray (Float32Array, Uint8ClampedArray)

局限性

  • 只去除了 Gemini 可见的水印(即右下角的半透明 Logo
  • 无法去除隐形或隐写水印。(了解更多关于 SynthID 的信息)
  • 针对 Gemini 当前的水印模式设计(截至 2025 年)

免责声明

本工具仅限个人学习研究所用,不得用于商业用途。

根据您所在的司法管辖区及图像的实际用途,移除水印的行为可能具有潜在的法律影响。用户需自行确保其使用行为符合适用法律、相关服务条款以及知识产权规定,并对此承担全部责任。

作者不纵容也不鼓励将本工具用于侵犯版权、虚假陈述或任何其他非法用途。

本软件按“原样”提供,不提供任何形式(无论是明示或暗示)的保证。在任何情况下,作者均不对因使用本软件而产生的任何索赔、损害或其他责任承担任何义务。

许可证

MIT License

相关链接

致谢

基于 Gemini Watermark Tool C++ 版本移植