uni-app图片加水印;小程序图片添加水印;使用canvas上传图片加水印

原博主:点击查看

需求: 微信小程序,上传图片,成功后图片有水印,既图片的网络地址也有水印。
上传图片使用uni-app的uni.chooseImage()方法,水印是用canvas。

以下代码可以直接使用:(注意:如果遇到canvas无效或者图片不显示问题:可能就是你在自定义组件内使用canvas,但是没有传递第二个参数this导致的,详见已知问题和解决办法)

<template><view class="content"><view v-for="(photo,index) in photoData" :key="index" class="photo"><image :src="photo" @click="previewPhoto(photo,photoData)"></image><view class="closeA" @tap="deletePhoto(index)">&times;</view></view><view class="btnAddPhoto" @click="btnAddPhoto">+</view><!-- 获取有水印的图片过程 必须使canvas显示 获取完成后在隐藏掉canvas 配合canvas样式定位 使其错位 --><!-- canvas的隐藏 在小程序中 使用 v-if或display:none 都不生效   使用hidden属性 true隐藏 false显示 --><canvas :style="{width:canvasWidth,height:canvasHeight}" canvas-id="myCanvas" :hidden='flagC'></canvas></view>
</template><script>
export default {data() {return {flagC: false,photoData: [],photoArray: [],canvasWidth: '',canvasHeight: '',photoIndex: 0}},onLoad() {},methods: {// 添加图片事件btnAddPhoto() {this.photoIndex = 0;let ctx = uni.createCanvasContext('myCanvas');uni.chooseImage({count: 6,sourceType: ['album', 'camera'],success: res => {this.photoArray = res.tempFilePaths;uni.showLoading({title: "图片加载中..."})this.callAddWaterMart();}})},// 调用添加水印的函数callAddWaterMart() {this.addWaterMark(() => {if (this.photoIndex < this.photoArray.length - 1) {this.photoIndex++;this.callAddWaterMart()} else {uni.hideLoading()}})},// 添加水印addWaterMark(callback) {this.flagC = falseuni.getImageInfo({// 注意此时的地址是正常的图片地址 以下是给图片添加水印返回新的url地址src: this.photoArray[this.photoIndex],success: res => {this.canvasWidth = `${res.width}px`;this.canvasHeight = `${res.height}px`;var ctx = uni.createCanvasContext('myCanvas');// 在自定义组件内 需要传递第二参数 this canvas才生效// var ctx = uni.createCanvasContext('myCanvas', this);ctx.clearRect(0, 0, res.width, res.height);ctx.beginPath();ctx.drawImage(this.photoArray[this.photoIndex], 0, 0, res.width, res.height); // 第一个参数是图片 第二、三是图片在画布位置 第四、五是将图片绘制成多大宽高(不写四五就是原图宽高)// 为图片添加水印ctx.translate(res.width / 2, res.height / 2);ctx.rotate(45 * Math.PI / 180);//这部分是水印的大小位置和数量let horizontal = res.width / 4;let vertical = res.height / 3;let fonstsize = res.width / 30;for (let i = 0; i <= 2; i++) {for (let j = 0; j <= 2; j++) {ctx.beginPath();ctx.setFontSize(fonstsize);ctx.setFillStyle("rgba(255,255,255,0.3)");// ctx.fillText("-仅供保险投保使用-", i * horizontal - res.width / 2, j * vertical - res.height / 2);ctx.fillText("--仅供保险投保使用--", (i * horizontal - res.width / 2) * 2, j * vertical - res.height / 2, fonstsize*15*2);}}// 开始绘制添加水印的图片并显示在页面中ctx.draw(false, () => {setTimeout(() => {console.log("asdf");uni.canvasToTempFilePath({canvasId: "myCanvas",success: res => {// 注意此时的地址是加了水印的图片地址(直接url输入浏览器也可以查看包含水印)console.log(123,res.tempFilePath)this.flagC = truethis.photoData.push(res.tempFilePath);callback();}})// 在自定义组件内 需要传递第二参数 this canvas才生效// }, this)}, 500)});}})},// 预览图片previewPhoto(url, list) {uni.previewImage({current: url,urls: list.map(item => item)})},// 删除图片deletePhoto(index) {this.photoArray.splice(index, 1);this.photoData.splice(index, 1);console.log(this.photoArray)}}
}
</script><style>
.content {padding: 20upx;
}
.photo,
.photo image {display: inline-block;width: 220upx;height: 220upx;
}
.btnAddPhoto {width: 220upx;height: 220upx;border: dashed 1px #aaa;display: flex;justify-content: center;align-items: center;font-size: 50upx;
}
canvas {border: solid 1px gray;position: absolute;left: 5000upx;
}
</style>

未知问题: 小程序模拟器上,上传第一张图片没问题,再次上传第二张图片,会发现第二张图片显示出来的是两张图片的叠加图;但是在真机使用时候,却不会出现也不影响(故没有处理,猜测解决方案:可以再每次上传图片处理水印时候,使用不同的canvas元素,不要使用同一个去做水印);

已知问题:
1.若canvas图片渲染不出来,也就是uni.createCanvasContext()方法无效
2.或ctx.draw()无效,
3.或uni.canvasToTempFilePath()接口总是失败;
4.或拿不到图片的tempFilePath;以上问题都是一个原因导致

(查看uni-app文档或者微信小程序canvas文档 ,可知原因:1.是需要在template模板里有canvas元素;2.是在自定义组件或者公共组件内,必须传递第二个参数this)。

解决办法就是: createCanvasContext和canvasToTempFilePath两个地方的方法需要传递第二参数this

var ctx = uni.createCanvasContext('myCanvas', this);uni.canvasToTempFilePath({获取图片的内容代码 详见下面}, this)

截图是uni-app的文档:在这里插入图片描述
在这里插入图片描述

微信小程序工具 操作上传一张图:
在这里插入图片描述

未知问题演示:上传第二张图:(叠加图片问题只会在小程序模拟器中出现,在实际真机使用中不会影响)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue或js解析文件excel表格js通过插件解析表格读取文件

安装插件 cnpm i xlsx --save-dev cnpm i jquery --save-dev 引入插件 html引入文件 <input type"file" id"excel-file" value"file"/> dom加载完成解析文件 mounted() {$(#excel-file).change(function(e) {var files e.target.fi…

微信小程序request请求封装;微信小程序封装request请求;uni-app小程序封装request请求;

本片封装了微信小程序request请求&#xff1b;为别是post get put请求&#xff0c;重点在request.js文件 1.新增四个文件 2.根目录下的utils下的request.js封装uni.request()请求 2.1 manifest.json&#xff1a;解决H5浏览器跨域问题-----配置代理一定要重启项目 // 自定义配…

关“视觉神经系统是怎么形成的?”的思考

http://www.cnblogs.com/mrxsc/p/5571358.html 视觉信息的处理是一个非常复杂的过程&#xff0c;这不由得让我想到了同样位于人们大脑中的新大脑皮层&#xff0c;作为人类智能的起始之地&#xff0c;它的运作也不简单&#xff0c;但是在婴儿时期&#xff0c;它的各部分单元并没…

uni-app控制小程序版本更新;小程序自动更新版本;uni-app发布新版本后仍旧是老版本问题

问题&#xff1a; 首先小程序&#xff0c;更新版本发布后&#xff0c;用户的版本一般情况下仍是旧版本&#xff1b;需要手动删除小程序后&#xff0c;在重新搜索打开才能使用新版本&#xff1b; 原因查看&#xff1a; 运营机制&#xff1b;更新机制&#xff1b; 解决办法&…

浅尝boost之format

From: http://www.cnblogs.com/WuErPIng/archive/2005/04/21/142308.html 概述 std::string是个很不错的东东&#xff0c;但实际使用时基本在每个程序里都会遇到不愉快的事情&#xff1a;格式化字符串。我甚至由于这个原因在代码里引入平台有关的MFC&#xff0c;ATL等本…

nuxt 服务器构建因太耗CPU进程被杀解决办法

在本地打包然后上传到github 再下载到服务器 如果你项目中有.gitignore那把里面的.nuxt删了(.gitignore是设置GIT不上传的文件)并把dist改为/dist 然后用git或者sourcetree上传项目到github&#xff0c;我这里用的sourceTree 上传完成 到服务器把项目下载下来 我这用的linu…

实用的rpm网站

http://www.rpmfind.net和 http://rpm.pbone.net/转载于:https://blog.51cto.com/nickcoco/993222

在VisualStadio2015上使用EF6.0建立MySql数据库

1.新建工程 2.建立类的文件夹DAL 3.建立相关类 【Student类】 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ETTest3{ public class Student { public int Id { get; set; } public string La…

固定列表的表格

固定的行&#xff1a;行名称不一样&#xff0c;每一个值对应赋值 html&#xff1a; <el-table class"table-box" :data"allObj.peoArr"><el-table-column prop"name" min-width"130"></el-table-column><el-ta…

拼图算法分析...

From: http://blog.sina.com.cn/s/blog_6a4b57e30100mfch.html 一、题目说明&#xff1a;   &#xff08;九宫问题&#xff09;在一个&#xff13;&#xff13;的九宫中有&#xff11;&#xff0d;&#xff18;这&#xff18;个数及一个空格随机的摆放在其中的格子里&#…

uni-app小程序本地打包超过2M不能预览问题;小程序打包过大不能预览和真机调试;uni-app分包;

一、问题&#xff1a;我们在小程序工具中开发时候&#xff0c;需要本地打包&#xff0c;但是当本地的打包文件大于2M时候&#xff0c;预览的二维码就会有问题&#xff0c;导致真机扫码打不开或者有遗漏。 二、此时就需要开启分包 1.微信小程序每个分包的大小是2M&#xff0c;总…

Asp.Net MVC开源CMS - Orchard

最近在学习Asp.Net MVC, 一直是step by step地看官方文档。 想找个成熟的MVC开发的开源系统&#xff0c;系统学习一下MVC, 搜索了一下&#xff0c;惊喜的发现了Orchard. 这个是介绍 2011/01/21号发布的关于Orchard的介绍&#xff0c;说明Orchard还是一个非常新鲜的事物。以后会…

拼图游戏及其相关算法

From: http://blog.sina.com.cn/s/blog_4ed8b87701011c6x.html 这个问题其实可以简单表述成&#xff0c;3*3的格子装了1至8&#xff0c;8个数字&#xff0c;数字是随机分布于各个格子中&#xff0c;问是否可以利用空格的格子&#xff0c;移动装有数字的格子最终达到某种序列&a…

在移位数组中查找数

题目描述&#xff1a; 一个数组是由一个递减数列左移若干位形成的&#xff0c;比如{4&#xff0c;3&#xff0c;2&#xff0c;1&#xff0c;6&#xff0c;5}是由{6&#xff0c;5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1}左移两位形成的&#xff0c;在这种数组中查…

小程序分享功能记录;小程序页面分享给好友携带参数

需求&#xff1a; 现有首页index和新增车辆页add-car。 正常操作流程是&#xff1a;从首页index点击按钮&#xff0c;会携带参数id跳转到新增车辆页add-car。 现在需求是用户A从首页index携带参数id跳转到新增车辆页add-car&#xff0c;在add-car页面点击分享按钮&#xff0c;将…

mysql事务处理

2019独角兽企业重金招聘Python工程师标准>>> ACID:Atomic、Consistent、Isolated、Durable 存储程序提供了一个绝佳的机制来定义、封装和管理事务。 1&#xff0c;MySQL的事务支持 MySQL的事务支持不是绑定在MySQL服务器本身&#xff0c;而是与存储引擎相关&#x…

记录一次uni-app页面跳转无效 来回跳转问题

问题&#xff1a;本身代码写的有问题导致的。从首页A跳转到新增页面B&#xff0c;在B页面点击保存后&#xff0c;再跳到首页A。此时在首页A&#xff0c;这时候无论点击跳转哪个页面&#xff0c;跳转成功后都会立即再跳回首页。 原因&#xff1a;B页面保存后&#xff0c;因为加了…

IE6双倍边距

2019独角兽企业重金招聘Python工程师标准>>> 前言&#xff1a;IE6双倍边距这个问题其实早在学习CSS之初都已经知道如何解决&#xff0c;但当时只知道如何解决而并不知道引起这个BUG的原因是什么&#xff0c;再接下来工 作过程中不断实践也终于明白是怎么回事了。但最…

typeid详解

From: http://www.cppblog.com/smagle/archive/2010/05/14/115286.aspx 在揭开typeid神秘面纱之前&#xff0c;我们先来了解一下 RTTI &#xff08;Run-Time Type Identification&#xff0c;运行时类型识别&#xff09;&#xff0c;它使程序能够获取由基指针或引用所指向的对…

H5静态页面跳转微信小程序;从外部浏览器,点击H5链接跳转打开微信小程序;以及在微信内直接点击H5链接打开微信小程序;

参考链接 需求&#xff1a;从外部浏览器&#xff0c;点击H5链接跳转打开微信小程序&#xff1b;以及在微信内直接点击H5链接打开微信小程序&#xff1b; 步骤1&#xff1a; 小程序开发需要使用云开发创建项目&#xff0c;使用云开发生成的项目会自带云函数文件夹&#xff1b;…