微信小程序之canvas绘制海报分享到朋友圈
绘制canvas内容
首先,需要写一个canvas标签,给canvas-id命名为shareBox
<canvas canvas-id="shareBox"></canvas>
其次,我们就要根据需求(效果图如下)在canvas上面绘制内容了,我这里canvas指的是红框里面的内容

然后开始绘制内容啦,先定义一个绘制内容的方法:drawImage
drawImage() {
//绘制canvas图片
var that = this;
console.log(that.data.userInfo);
var qrPath = that.data.qrcode_temp; //小程序码本地路径
var imgLogo = that.data.photoTempath; //微信头像本地路径
var banner = that.data.banner_temp; //展会bannertu的本地路径
var bgimg = "/images/bg4@2x.png"; //背景图
//创建一个canvas对象
const ctx = wx.createCanvasContext('shareBox', this);
ctx.setFillStyle("white");
var canvasWidth = that.data.width; //自适应宽
var canvasHeight = that.data.height - that.data.footHeight; //自适应高 (减去底部高度)
console.log(canvasWidth + "--" + canvasHeight)
ctx.fillRect(0, 0, canvasWidth, canvasHeight);
ctx.drawImage(bgimg, 10, 10, canvasWidth-20, canvasHeight-20);
//绘制分享标题
ctx.setFontSize(15);
ctx.setFillStyle('#000');
ctx.setTextAlign('left');
ctx.fillText(that.data.userInfo.nickName+"邀请您一起参加", 110, 50, canvasWidth-135);
var title = that.data.exhibitionDetail.ExName;
if (title.length > 17) {
var a = title.substr(0, 17);
var b = title.substr(17, title.length);
ctx.fillText(a, 110, 70, canvasWidth - 135);
ctx.fillText(b, 110, 90, canvasWidth - 135);
}else{
ctx.fillText(title, 110, 70, canvasWidth - 135);
}
//绘制标题
ctx.setFontSize(15);
ctx.setTextAlign('left');
ctx.setFillStyle('#000');
ctx.fillText(title, 30, 250, canvasWidth - 60);
ctx.fillText(title, 30, 250, canvasWidth - 60);
//绘制时间
ctx.setFontSize(12);
ctx.setTextAlign('left');
ctx.setFillStyle('#333');
var time = that.data.exhibitionDetail.StartTime+"至"+ that.data.exhibitionDetail.EndTime;
ctx.fillText(time, 30, 270, canvasWidth - 60);
//绘制地点
ctx.setFontSize(12);
ctx.setTextAlign('left');
ctx.setFillStyle('#333');
var place = that.data.exhibitionDetail.Place;
ctx.fillText(place, 30, 290, canvasWidth - 60);
//绘制圆形头像
ctx.save();
ctx.beginPath();
ctx.arc(65, 65, 35, 0, 2 * Math.PI,false);
ctx.setStrokeStyle('#eee')
ctx.stroke(); //画了背景的话要先画圆在裁剪才能有圆形图片
ctx.clip(); //裁剪
ctx.drawImage(imgLogo, 30, 30, 70, 70);
ctx.restore();
//绘制banner图
// ctx.drawImage(banner, 15, 120, 150, 315);
//绘制小程序码图
//ctx.drawImage(banner, 70, 310, 100, 100);
ctx.draw();
}
代码解释:
一、关于画圆形图片
这里遇到的问题是: 绘制圆形图片的时候需要裁剪,一开始我没有绘制背景,直接裁剪的(就是没有ctx.stroke()这一步也是能成功的画出圆形图片的)。
之后加了背景图之后,就无效了,查看了许多资料得知有背景图的情况下,需要先把圆画出来,再裁剪才行,就是我上诉代码中红色备注中的写法。
二、关于网络图片的应用
上述代码中有注释写的是本地路径,这个本地路径就是网络图片对应的本地临时路径,如何拿到本地临时路径,得借助小程序内置方法:wx.downloadFile
用法如下:我这里是下载的用户头像,这里的res.temFilePath就是本地临时路径了
注:下载图片的域名要在小程序后台的downloadFile里面加上才行
var that = this;
wx.downloadFile({
url: that.data.userInfo.avatarUrl,
success: function (res) {
console.log('图片:' + res.tempFilePath);
that.setData({
photoTempath: res.tempFilePath
})
}
})
三、关于canvas自适应屏幕
我这里是需要自适应的,一开始我是想着能不能用%来写宽高,实践之后发现是不行的,于是在小程序api中找到wx.getSystemInfo方法拿到设备的宽高
var that = this;
wx.getSystemInfo({
success: function (res) {
console.log(res)
that.setData({
width: res.windowWidth,
height: res.windowHeight
})
}
获取元素高度:
var that = this;
const query = wx.createSelectorQuery();
query.select('.share-box').boundingClientRect();
query.exec(function (res) {
that.setData({
footHeight: res[0].height
})
console.log(that.data.footHeight)
})
四、小程序码生成
前端调用后台接口获取小程序码,参数:page(小程序码的跳转页面),id(页面参数)
生成小程序码后同样需要获取本地临时路径才能在canvas中绘制出来,
注:通过小程序码进入的页面,在onload方法里面可以得到一个参数:scene,这个属性就是生成小程序码的时候传的那个页面参数
上述代码的实现效果如下:我这里的小程序码和banner图暂时没有,而且数据也是瞎写的,凑合看吧

canvas转成图片保存到相册
canvasToImage() {
var that = this;
// canvas画布转成图片
wx.canvasToTempFilePath({
quality: 1,
fileType: 'jpg',
canvasId: 'shareBox',
success: function (res) {
wx.hideLoading();
console.log('11' + res.tempFilePath);
that.setData({
img_temp: res.tempFilePath
})
// wx.previewImage({
// current: res.tempFilePath, // 当前显示图片的http链接
// urls: [res.tempFilePath] // 需要预览的图片http链接列表
// })
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success(res) {
console.log(res);
wx.showModal({
title: '',
content: '图片已保存到相册,赶紧晒一下吧',
showCancel: false,
confirmText: '好的',
confirmColor: '#72B9C3',
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
}
that.setData({
visible: false
})
}
})
},
fail: function (res) {
if (res.errMsg === "saveImageToPhotosAlbum:fail auth deny") {
wx.openSetting({
success(settingdata) {
console.log(settingdata)
if (settingdata.authSetting['scope.writePhotosAlbum']) {
that.saveImg(); //保存失败尝试再次保存
} else {
console.log('获取权限失败,给出不给权限就无法正常使用的提示')
}
}
})
}
}
})
},
fail: function (res) {
console.log(res)
}
}, this)
},
这样就可以把canvas转成图片保存在本地了,分享朋友圈在相册找图就好了
微信小程序之canvas绘制海报分享到朋友圈的更多相关文章
- 微信小程序利用canvas生成海报分享图片
一 . 效果 这是借用女神照生成的分享的海报,图片来自网络. 新增了poster组件和更新图片自适应 二 . 准备 准备两张图片连接,最好是自己开发账号验证的https图片链接. 三 . 实现思路 其 ...
- 微信小程序使用canvas绘制图片的注意事项
1.单位换算问题,canvas的尺寸单位是px,所以单位需要做个换算,可以通过wx.getSystemInfo获取屏幕宽高(单位是px),微信小程序无论什么机型,屏幕宽度都是750rpx,因此可以做个 ...
- 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)
小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...
- 微信小程序-基于canvas画画涂鸦
代码地址如下:http://www.demodashi.com/demo/14461.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.co ...
- 关于微信小程序前端Canvas组件教程
关于微信小程序前端Canvas组件教程 微信小程序Canvas接口函数 上述为微信小程序Canvas的内部接口,通过熟练使用Canvas,即可画出较为美观的前端页面.下面是使用微信小程序画图的一些 ...
- 微信小程序 在canvas画布上划动,页面禁止滑动
要实现微信小程序 在canvas画布上划动,页面禁止滑动,不仅要设置disable-scroll="true",还要要给canvas绑定一个触摸事件才能生效. <canvas ...
- 微信小程序初探--写个扫雷分享给你玩
闲暇里,想学一下微信小程序, 于是,用微信小程序原生做了个扫雷玩. 以下略作总结,分享给大家. 微信里下拉,输入[mini计算器], 看到这个图标的就是了: 说好的扫雷,怎么变成计算器了?原因后面解释 ...
- 关于微信小程序使用canvas生成图片,内容图片跨域的问题
最近有个项目是保存为名片(图片),让用户发送给朋友或朋友圈,找了很多方案都不适用,绞尽脑汁之后还是选了使用canvas,但是用这玩意儿生成图片最大的缺点就是,如果你的内容中有图片,并且这个图片是通过外 ...
- 校园表白墙、微信表白墙、校园墙 微信小程序 JAVA 开发记录与分享
目录 最新版表白墙博客地址 1.微信小程序前台展示 2.功能介绍 3.后台管理 4.后端语言采用 JAVA 开发 5.体验此微信小程序 扫描下方二维码 6.如何联系我或需要源码进行联系 最新版表白墙博 ...
随机推荐
- P2P互联网金融企业的四大转型方向
1.按照国标做成百分百的信息中介平台.这个定位太低,无利可图,如果政策导向真按着这个路径走,未来可能只剩下不到50家平台; 2.转型成为带“民营银行”属性的平台.这还得国家网开一面,学习英国模式,允许 ...
- JSON字符串与Map互转
//一.map转为json字符串 public static String map2jsonstr(Map<String,?> map){ return JSONObject.toJSON ...
- 【题解】魔板—洛谷P1275。
话说好久没更博了. 最近学了好多知识懒的加进来了. 有幸认识一位大佬. 让我有了继续更博的兴趣. 但这是一个旧的题解. 我在某谷上早就发过的. 拿过来直接用就当回归了吧. 其实这道题有一个特别关键的思 ...
- 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解
2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...
- LeetCode第十五题-找出数组中三数和为0的答案
3Sum 问题简介: 给定n个整数的数组nums,是否有元素a,b,c在nums中,使a + b + c = 0? 找到数组中所有唯一的三元组,它们的总和为零 注:解决方案集不得包含重复的三元组 例如 ...
- Saltstack自动化操作记录(1)-环境部署【转】
早期运维工作中用过稍微复杂的Puppet,下面介绍下更为简单实用的Saltstack自动化运维的使用. Saltstack知多少Saltstack是一种全新的基础设施管理方式,是一个服务器基础架构集中 ...
- C++入门篇六
struct和class的访问权限:结构体,类 struct和class 是相同的,唯一的而不同,就是默认权限,struct是public,class默认是private class Animal { ...
- Zypper常用命令
Zypper是OpenSUSE和企业版SUSE中软件包管理器ZYpp的命令行接口. 主要用于:1.管理软件包:zypper可用来安装.删除.更新和查询本地或远程的软件包.2.管理仓库:zypper可用 ...
- 关于form-checkbox 必填项无效的错误
校验规则要写在一个form里 检查data,给个默认值. 否则刚进去错误提示不显示. 其次,要加 type 类型,注意大小写 触发类型为 change .
- ELK搭建<三>:安装Kibana
1.下载Kibana,如果需要低版本的,低版本下载 2.解压后,进入config修改配置文件kibana.yml : #运行的端口号 server.port: 5601 #服务器地址 server.h ...