图片水印
文字/图片/平铺/透明度
配置 · 实时预览
上传 logo
推荐透明背景 PNG
方形或长方形 · 按宽度等比缩放
文件列表 · 点击预览
使用提示
关于本工具
了解工具定位 · 使用场景 · 对比优势
给图片批量添加文字或图片水印,支持自定义透明度、平铺位置和旋转角度。自媒体博主批量保护原创图、电商运营给产品图打品牌标识、设计师快速输出带版权水印的样稿,无需安装软件。所有处理在浏览器本地完成,图片不上传服务器。
使用场景
摄影作品防盗
独立摄影师在社交平台发布样片时,常被无授权搬运。本工具支持上传透明背景的签名图片(如个人 Logo),以 30% 透明度平铺至整张照片,既不影响画面观感,又让盗图者难以裁切或覆盖。一张照片处理仅需 3 秒,批量导出时自动保留 EXIF 信息。
企业文档水印
公司内部的设计稿、报价单在微信传输过程中易被截图外泄。本工具可批量导入 PDF 或图片,用固定文字(如「内部资料·不可外传」)沿对角线平铺,透明度设为 15%,确保阅读不受干扰,但截图后水印清晰可辨。无需上传服务器,文件全程在本地处理。
电商商品主图
淘宝店主在详情页展示实物图时,担心被同行直接扒图使用。本工具支持在图片右下角叠加店铺名称(文字水印),字体、字号、颜色可自定义,与背景形成对比。平铺模式还可用于全图覆盖,防止截图后裁掉角落水印。单张处理速度 < 1 秒,适合批量上新。
课件版权保护
教师将 PPT 转成图片发给学生复习时,常被二次传播到公开平台。本工具可在每页课件底部叠加「仅供本班学习」文字,透明度调至 20%,不影响阅读。支持一次导入 20 页 PDF,自动识别页面尺寸并保持水印位置统一,全程离线处理,不泄露学生信息。
素材预览防滥用
设计师向客户发送素材预览图时,需防止对方直接商用。本工具可将一张「预览专用」图片以 50% 透明度平铺至整张素材,客户能看清构图和色彩,但无法直接用于成品。支持自定义平铺间距和角度,避免水印被局部修复工具擦除。
对比矩阵本工具 vs 竞品 vs 传统方法
| 维度 | 本工具 | Watermarkly(竞品 A) | Photoshop(传统方法) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,图片不上传服务器 | 上传图片至服务器处理 | 本地处理,依赖本地软件 |
| 处理速度 | 1-3 秒(取决于图片大小) | 5-15 秒(含上传下载时间) | 30 秒 - 数分钟(需手动操作) |
| 离线可用 | 支持,完全离线运行 | 不支持,需联网 | 支持,需安装软件 |
| 批量处理 | 支持,一次上传多张 | 支持,付费版批量 | 支持,需录制动作或脚本 |
| 收费模式 | 免费 | 免费版有水印限制,Pro 版 $9.99/月 | 一次性购买 $22.99/月(摄影计划) |
| 水印样式 | 文字、图片、平铺、透明度调节 | 文字、图片、平铺、位置、旋转 | 文字、图片、图层样式(需手动配置) |
| 操作门槛 | 打开即用,无学习成本 | 界面简洁,需简单熟悉 | 学习曲线陡峭,需掌握图层概念 |
使用指南
上手步骤 · 输入输出 · 避坑提示
使用步骤
- 上传或拖入 JPG/PNG 图片,支持单张或多张同时处理
- 选择水印类型:文字水印(输入自定义文本)或图片水印(上传 PNG 图标)
- 调整水印位置(九宫格点击)、透明度(0-100 滑块)及平铺模式(单次/平铺覆盖)
- 点击「预览」查看水印效果,确认无误后点击「下载」保存单张图片
输入输出示例7 个典型场景,覆盖常规、边界与易错
| 输入 | 输出 | 说明 |
|---|---|---|
| 文字水印:'© 2025 示例',位置:右下角,透明度:50%,字体大小:24px | 原图右下角叠加半透明文字 '© 2025 示例',字体大小 24px,透明度 50% | 典型场景:版权声明水印 |
| 图片水印:logo.png(200x200),位置:平铺,透明度:30% | 原图全幅平铺 logo.png,每块间距 50px,透明度 30% | 典型场景:全图防盗平铺水印 |
| 文字水印:'测试',位置:左上角,透明度:100%,字体大小:72px | 原图左上角叠加不透明文字 '测试',字体大小 72px,完全覆盖下方内容 | 边界 case:100% 透明度(完全不透明) |
| 图片水印:logo.png(200x200),位置:居中,透明度:0% | 原图居中叠加完全透明 logo.png,肉眼不可见 | 边界 case:0% 透明度(完全透明,无视觉影响) |
| 文字水印:'A',位置:右下角,透明度:50%,字体大小:1px | 原图右下角叠加极小文字 'A',字体大小 1px,几乎不可辨识 | 边界 case:最小字体大小 1px |
| 图片水印:logo.png(200x200),位置:左上角,透明度:50%,平铺间距:0px | 原图左上角开始平铺 logo.png,间距 0px,形成无缝拼接图案 | 易错 case:平铺间距为 0 时图案连续 |
| 文字水印:'测试',位置:右上角,透明度:50%,字体大小:0px | 提示错误:字体大小必须大于 0 | 易错 case:字体大小输入 0 或负数 |
常见错误对照8 个常踩的坑 · 错误 → 修复
1. 水印文字用全角标点导致渲染异常
水印内容:版权所有©2024水印内容:版权所有 (C) 2024部分浏览器 Canvas 渲染全角标点(如©、®、℃)时字体 fallback 不一致,导致字符显示为方块或乱码。建议用半角替代符号或 Unicode 转义。
2. 图片水印用透明 PNG 但未处理背景
上传一张带白色背景的 PNG 作为水印上传一张透明背景的 PNG(如 logo 去底后导出为 PNG-24)工具不会自动抠图;如果 PNG 有白色背景,叠加后白色会覆盖原图内容。需要用户自行准备透明底图片。
3. 平铺模式间距设为零导致重叠
平铺间距:0px平铺间距:50px(或水印尺寸的 1.5 倍)间距为 0 时水印紧贴排列,视觉上变成一整块纹理,失去防伪效果。建议间距至少为水印尺寸的 50%。
4. 透明度设 100% 等于没加水印
水印透明度:100%水印透明度:30%-50%透明度 100% 表示完全不透明,水印会完全遮挡下方原图内容;透明度 0% 表示完全透明。常见有效范围是 20%-60%。
5. 文字水印用超长字符串导致界面卡顿
水印文字:这是一段长达 500 字的版权声明……水印文字:© 2024 Company NameCanvas 渲染超长文本(>200 字)时浏览器会逐字测量宽度,导致界面冻结数秒。建议水印文字控制在 50 字以内。
6. 上传超大图片后直接下载原图大小
上传一张 8000×6000px 的 RAW 格式照片上传前将图片缩放到 4000px 以内(或使用 JPEG 格式)工具在浏览器端处理,超大图片(>5000px)会耗尽内存导致标签页崩溃。建议先压缩到常用尺寸再上传。
7. 图片水印误用了 JPG 格式
上传一个 .jpg 文件作为水印图片上传 .png 或 .webp 格式(带透明通道)JPG 不支持透明通道,叠加后水印区域会显示白色或黑色背景块。只有 PNG/WebP 支持 alpha 通道实现半透明叠加。
8. 文字水印颜色与背景完全相同
水印颜色:#FFFFFF(白色),原图背景也是白色水印颜色:#000000(黑色)或与原图背景色差 ≥ 30% 的对比色颜色相同会导致水印完全不可见。建议用取色器先查看原图主色调,选择互补色或深色系。
工作原理
公式推导 · 流程图解 · 依据出处
核心公式
O = I × (1 - α) + W × α
变量说明
O— 输出像素的最终颜色值I— 原始图像对应像素的颜色值α— 水印透明度(0~1 之间)W— 水印图像对应像素的颜色值
示例
原始图像某像素 RGB=(200,150,100),水印像素 RGB=(50,50,50),透明度 α=0.3。则 R 通道:200×(1-0.3)+50×0.3=140+15=155;G 通道:150×0.7+50×0.3=105+15=120;B 通道:100×0.7+50×0.3=70+15=85。最终输出像素 RGB=(155,120,85)。
适用范围
适用于逐像素 Alpha 混合(标准图像合成公式)。不适用于非 RGB 色彩空间(如 CMYK)或带 Gamma 校正的线性混合场景。来源:Porter & Duff 1984 年《Compositing Digital Images》论文。
原理图
开发者集成
3 种主流语言 · 复制即用
from PIL import Image, ImageDraw, ImageFont
# 文字水印:平铺 + 透明度
img = Image.open('input.jpg').convert('RGBA')
overlay = Image.new('RGBA', img.size, (0, 0, 0, 0))
draw = ImageDraw.Draw(overlay)
font = ImageFont.truetype('arial.ttf', 36)
# 半透明灰色文字
text = 'Watermark'
fill = (128, 128, 128, 60) # RGBA,A=60/255
# 平铺:每 200px 重复
for y in range(0, img.height, 200):
for x in range(0, img.width, 200):
draw.text((x, y), text, font=font, fill=fill)
result = Image.alpha_composite(img, overlay)
result.save('output.png')package main
import (
"image"
"image/color"
"image/draw"
"image/jpeg"
"image/png"
"log"
"os"
"golang.org/x/image/font"
"golang.org/x/image/font/basicfont"
"golang.org/x/image/math/fixed"
)
func main() {
src, err := os.Open("input.jpg")
if err != nil {
log.Fatal(err)
}
defer src.Close()
img, _, err := image.Decode(src)
if err != nil {
log.Fatal(err)
}
// 创建半透明覆盖层
overlay := image.NewRGBA(img.Bounds())
draw.Draw(overlay, overlay.Bounds(), img, image.Point{}, draw.Src)
// 平铺文字水印(简化:仅左上角一个)
col := color.RGBA{128, 128, 128, 60}
point := fixed.Point26_6{fixed.I(50), fixed.I(100)}
d := &font.Drawer{
Dst: overlay,
Src: image.NewUniform(col),
Face: basicfont.Face7x13,
Dot: point,
}
d.DrawString("Watermark")
out, _ := os.Create("output.png")
defer out.Close()
png.Encode(out, overlay)
}const { createCanvas, loadImage, registerFont } = require('canvas');
const fs = require('fs');
async function addWatermark() {
const img = await loadImage('input.jpg');
const canvas = createCanvas(img.width, img.height);
const ctx = canvas.getContext('2d');
// 绘制原图
ctx.drawImage(img, 0, 0);
// 文字水印:平铺 + 透明度
ctx.font = '36px Arial';
ctx.fillStyle = 'rgba(128, 128, 128, 0.24)'; // 60/255 ≈ 0.24
ctx.textAlign = 'left';
const text = 'Watermark';
for (let y = 0; y < img.height; y += 200) {
for (let x = 0; x < img.width; x += 200) {
ctx.fillText(text, x, y);
}
}
const buffer = canvas.toBuffer('image/png');
fs.writeFileSync('output.png', buffer);
}
addWatermark().catch(console.error);常见问题
8 个高频疑问