更新记录

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 极端小图按最低质量仍略超原图

体积为什么不会变大

  1. 输出画布分辨率与原图一致(仅在超出 maxCanvasSize 时等比缩小),不放大、不无谓重采样;
  2. 导出为 JPEG 时在 [5%, 92%] 质量区间二分搜索,取「体积 ≤ 原图」的最大质量;照片类图片通常一次或两三次即命中;
  3. 原图体积通过各端文件系统直接读取(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(右下角标识 / 斜向平铺 / 多行描边 / 组合水印四种方案)。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。