uni-app实现图片水印添加 uni-app选择图片后自动加水印

夜婷姑娘_1679

夜婷姑娘_1679

2026-05-15

638人浏览

原创

uni-app图片加水印必须用canvas前端绘制,因原生不支持且多端行为差异大;需显式设置canvas宽高、用px字体、clearRect清空、分平台加载图片,并在draw回调中导出。

uni-app实现图片水印添加 uni-app选择图片后自动加水印

uni-app 中图片选择后加水印的核心限制 uni-app 本身不提供原生图片编辑能力,uni.chooseImage 只返回临时路径或 base64,后续必须用 canvas 手动绘制水印。这意味着:水印不是“附加元数据”,而是真正重绘一张新图;真机调试时 canvas 在 iOS 和 Android 的像素对齐、字体渲染、drawImage 缩放行为存在差异,直接套 Web 写法大概率出错。

关键判断:不能依赖服务端加水印(用户选完图就需立即预览),也不能用第三方 SDK(多数不兼容 uni-app 多端编译),唯一可行路径是「前端 canvas 绘制 + 适配多端 canvas 行为」。

用 uni.createCanvasContext 绘制文字水印的实操要点 常见错误是直接在 H5 上调通,一到小程序或 App 就水印偏移、模糊、不显示。根本原因是:uni.createCanvasContext 返回的上下文默认使用 rpx 坐标系,但 drawImage 的宽高参数却是 px 值,且不同平台对 canvas.width/canvas.height 的设置响应不一致。
  • 务必显式设置 canvas 元素的 width 和 height 属性(非 style),值建议取目标图宽高的 1:1,例如原图 800×600,canvas 就设 width="800" height="600"
  • 文字水印优先用 ctx.fillText 而非 ctx.strokeText,后者在部分安卓机型上会渲染异常
  • 字体大小统一用 px 单位(如 ctx.setFontSize(24)),禁用 rpx 或 %,否则 iOS 微信小程序里字体可能缩成一条线
  • 水印旋转角度建议 ≤ 25°,超过后某些低端安卓机 canvas 会截断文字
  • 绘制前必须调用 ctx.clearRect(0, 0, width, height),否则旧内容残留

将 base64 图片加载进 canvas 的兼容写法 uni.chooseImage 返回的 tempFilePath 在 H5 是 blob URL,在小程序是本地文件路径,在 App(尤其是 iOS)可能需要先转成 base64 才能被 canvas 正确加载。

正确流程:

uni.chooseImage({
  success: (res) => {
    const tempPath = res.tempFiles[0].path;
    // H5 和 App 需转 base64,小程序可直读
    if (uni.getSystemInfoSync().platform === 'h5' || 
        uni.getSystemInfoSync().platform === 'ios') {
      uni.getFileSystemManager().readFile({
        filePath: tempPath,
        encoding: 'base64',
        success: (readRes) => {
          const imgSrc = 'data:image/png;base64,' + readRes.data;
          drawWatermark(imgSrc); // 后续绘制函数
        }
      });
    } else {
      drawWatermark(tempPath);
    }
  }
});

注意:uni.getFileSystemManager().readFile 在微信小程序中不可用,所以必须按平台分支处理;App 端若用 plus.io 读取文件,路径格式与小程序完全不同,容易报 fail no such file 错误。

uni-app
uni-app

uni-app 是基于 Vue 的跨端开发框架,适合开发 H5、App、小程序、鸿蒙和多端业务应用。

下载

生成带水印的图片并保存的坑点 canvas.toTempFilePath 是最终导出的关键,但它在各端行为割裂严重:
  • 微信小程序:必须指定 canvasId,且该 canvas 必须已挂载到 DOM(v-if 切换中未渲染会导致 fail canvas is not found)
  • H5:toTempFilePath 不可用,必须用 canvas.toDataURL('image/png'),再用 uni.downloadFile 模拟保存(实际是触发浏览器下载)
  • App:iOS 需确保 canvas 已渲染完成(加 setTimeout 100ms 延迟调用),Android 则对 quality 参数敏感,设 0.8 以上才清晰
  • 所有平台都禁止在未完成绘制时调用导出,必须等 ctx.draw(true, () => { ... }) 回调中执行

最易忽略的一点:水印文字如果用了自定义字体(如从 static/font.ttf 加载),H5 可用 @font-face,但小程序和 App 完全不支持——只能用系统默认字体(sans-serif)或提前转成图片水印。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

uni-app

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2723

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5903

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6870

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6618

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

943

5

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

2023.10.23

4451

6

canva可画使用技巧汇总
canva可画使用技巧汇总

本专题汇集了PHP中文网精心整理的Canva可画新手使用技巧大全,专为零基础用户打造。无论你是想制作精美海报、PPT还是社交媒体配图,这里都有从注册登录、模板搜索到AI辅助设计、导出分享的全流程保姆级教程。通过深入浅出的图文指南,帮助你快速跨越设计门槛,轻松掌握Canva可画的实用操作,让每个人都能成为设计达人!

2026.05.19

264

21

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

20

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习