更新记录
0.0.1(2026-10-29)
下载此版本
- 初始版本:H5 / 微信·支付宝小程序 / App(Android·iOS) 多端图片水印
- 多水印、九宫格定位、比例/像素单位、旋转、平铺、描边、多行文本
- 体积守卫:自适应 JPEG 质量二分,加水印后体积严格不超原图
平台兼容性
uni-app(4.73)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
- |
5.0 |
√ |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
√ |
× |
× |
× |
× |
× |
× |
× |
× |
- |
- |
ant-watermark 自定义图片水印
自定义图片水印插件,一套 API 适配 H5、微信/支付宝小程序、App(Android/iOS),纯 JS 实现、无需原生插件与额外依赖。
核心承诺:加水印后图片体积不变大。 输出分辨率与原图一致,插件会自动二分搜索 JPEG 质量上限,保证输出体积 ≤ 原图体积。
特性
- 🖼️ 多端统一:H5 / 微信小程序(canvas 2d)/ 支付宝小程序 / App 全覆盖
- 📐 任意位置:九宫格
layoutGravity + 四方向 marginLeft/Right/Top/Bottom 边距
- 🔤 文字样式:字号(像素或宽/高/长边/短边比例)、颜色、描边、加粗、斜体、透明度、字族
- 🌀 旋转与平铺:任意角度
degrees,isRepeat 一键平铺整图
- 📄 多行文本:
\n 换行 + lineSpacing 行间距
- ➕ 多水印:一个水印对象数组同时叠加任意多个水印
- 📦 体积守卫:自适应 JPEG 质量二分,输出体积严格不超原图(分辨率不变)
快速上手
<!-- 小程序 / App 端需要:页面中放置画布载体(H5 端不需要,放置也无害) -->
<ant-watermark-canvas />
import { addWatermark } from '@/uni_modules/ant-watermark'
const res = await addWatermark({
src: '/storage/xxx/photo.jpg', // 原图:本地路径 / 临时路径 / 网络地址
watermarks: [{
text: '@蚂蚁工作室',
layoutGravity: 5, // 右下角
textSizeMode: 1, // 字号按图片宽度比例
textSize: 0.05, // 宽度的 5%
textColor: '#FFFFFF',
textStyle: 2, // 实心+描边
strokeWidth: 2,
marginMode: 1,
marginRight: 0.04,
marginBottom: 0.04
}]
})
// res.tempFilePath 加水印后的图片路径
// res.size 输出体积(字节)
// res.originalSize 原图体积(字节)
// res.sizeGuard 'pass' | 'fallback' | 'none' | 'failed'
也支持回调风格:addWatermark({ ..., success(res) {}, fail(err) {} })。
API
addWatermark(options)
| 参数 |
类型 |
必填 |
说明 |
| src / srcPath |
string |
是 |
原图路径,支持本地、临时与网络地址(小程序网络图需配置 download 域名白名单) |
| watermarks |
array |
是 |
水印配置数组; watermark、watermark2..9 字段写法 |
| quality |
number |
否 |
导出质量 0.05-0.95;不传则自动搜索满足体积约束的最高质量(默认 0.92 起) |
| format |
string |
否 |
jpg(默认)/ png;png 体积超出原图时自动降级 jpg |
| backgroundColor |
string |
否 |
透明图导出 jpg 时的底色,默认 #FFFFFF |
| outputPath |
string |
否 |
输出路径;App 端复制到该位置,H5 端作为下载文件名,小程序端默认临时目录 |
| maxCanvasSize |
number |
否 |
画布最大边长,默认 4096;超出时等比缩小以避免平台画布限制 |
watermarks[i] 水印项
| 参数 |
类型 |
默认 |
说明 |
| text |
string |
- |
水印文字,支持 \n 多行 |
| textColor |
string |
#FFFFFF |
文字颜色,支持 #RRGGBB / rgba() |
| textSize |
number |
20 |
文字大小(单位由 textSizeMode 决定) |
| textSizeMode |
number |
0 |
0 像素 | 1 宽度比例 | 2 高度比例 | 3 长边比例 | 4 短边比例 |
| textStyle |
number |
0 |
0 实心 | 1 描边 | 2 实心+描边 |
| strokeColor |
string |
#000000 |
描边颜色 |
| strokeWidth |
number |
0 |
描边宽度(像素) |
| layoutGravity |
number |
0 |
0 居中 | 1 左上 | 2 上 | 3 右上 | 4 右 | 5 右下 | 6 下 | 7 左下 | 8 左 |
| degrees |
number |
0 |
旋转角度(度,逆时针为正) |
| marginMode |
number |
0 |
边距单位:0 像素 | 1 宽度比例 | 2 高度比例 | 3 长边比例 | 4 短边比例 |
| marginLeft / marginRight / marginTop / marginBottom |
number |
0 |
对应方向边距 |
| lineSpacing |
number |
0 |
多行行间距(像素) |
| isRepeat |
boolean |
false |
是否平铺整图 |
| repeatGapX / repeatGapY |
number |
字号×2 / 字号×3 |
平铺间隙(像素) |
| opacity |
number |
1 |
整体透明度 0-1 |
| fontFamily |
string |
sans-serif |
字族(旧接口小程序不支持) |
| italic / bold |
boolean |
false |
斜体 / 加粗(旧接口小程序不支持) |
返回值 res
| 字段 |
说明 |
| tempFilePath |
加水印后的图片路径(H5 为 blob URL) |
| size / originalSize |
输出 / 原图体积(字节) |
| width / height / scale |
输出尺寸与缩放比例(scale < 1 表示触发了 maxCanvasSize 缩放) |
| format / quality |
实际导出格式与质量 |
| sizeGuard |
pass 体积未变大;fallback png 降级 jpg 后未变大;none 原图体积未知未对比;failed 极端小图按最低质量仍略超原图 |
体积为什么不会变大
- 输出画布分辨率与原图一致(仅在超出
maxCanvasSize 时等比缩小),不放大、不无谓重采样;
- 导出为 JPEG 时在
[5%, 92%] 质量区间二分搜索,取「体积 ≤ 原图」的最大质量;照片类图片通常一次或两三次即命中;
- 原图体积通过各端文件系统直接读取(H5 用 fetch/blob),字节级对比,不靠估算。
极端情况(如几 KB 的强压缩小图)最低质量仍略超原图时,返回历史最小结果并标记 sizeGuard: 'failed'。
平台差异说明
| 平台 |
实现方式 |
备注 |
| H5 |
离屏 DOM canvas + toBlob |
网络图需服务端允许跨域(CORS),否则画布被污染无法导出 |
| 微信小程序 |
canvas 2d 节点 + wx.canvasToTempFilePath |
网络图需配置 download 域名白名单 |
| 支付宝小程序 |
旧版 canvas 接口 |
字族/加粗/斜体受旧接口限制可能不生效 |
| App(Android/iOS) |
旧版 canvas + plus.zip.compressImage 原生压缩 |
鸿蒙 App 暂不支持 |
示例
完整示例见 pages/index/index.vue(右下角标识 / 斜向平铺 / 多行描边 / 组合水印四种方案)。