微信小程序生成分享海报方法(附带二维码生成)


Posted in Javascript onMarch 29, 2019

昨天写了一篇小程序本地生成二维码的功能小程序本地生成二维码,趁热打铁今天给大家分享一下小程序内生成海报的功能以及具体步骤

这次分享海报里面的元素比较少,进行绘制的分别有头像,海报背景以及二维码(二维码的生成请看上面《小程序本地生成二维码》一文),此次没有涉及到文字的绘制,不过原理大致相同,这篇文章就不对文字绘制进行阐述了。
下面我们就开始吧?

注:实现基于mpvue框架,如果使用小程序自有框架直接开发需要少许改动

流程

微信小程序生成分享海报方法(附带二维码生成)

0-1

微信小程序生成分享海报方法(附带二维码生成)

0-2

在(0-1)页面点击“生成专属海报” > 跳转到(0-2)页面进行海报

资源前期准备

在生成海报之前需要准备,头像,海报背景图以及二维码

为了在海报生成是页面没有闪动或者卡顿,需要先在(0-1)页面把这些数据准备好

需要注意的是,生成海报时需要时临时文件或者是本地文件,如果是网络图片,需要通过wx.getImageInfo() api获取图片的临时路径

这里头像用到的是网络路径,所以需要获取头像的临时临时路径,海报背景在本地直接用本地路径即可

二维码则通过weapp-qrcode生成后返回临时路径进行使用(生成逻辑详见文章开头“小程序本地生成二维码”)

准备完成后将资源信息以参数的形式传给(0-2)页面

let shareInfo = {
 headerImg: 'tempfilepath',
 bgImg: '本地路径的图片',
 qrcode: 'tempfilepath'
}
wx.navigateTo({
 url: '/pages/createPoster/main?shareInfo=' + JSON.stringify(shareInfo)
})

获取资源

在(0-2)中获取参数

我们公司的工程是通过mpvue搭建的,获取方法是

mounted () {
 const options = this.$root.$mp.query
 this.shareInfo= JSON.parse(options.shareInfo)
}
// 如果是通过微信开发工具直接开发则在onLoad函数中获取options
onLoad (options) {
 const shareInfo = JSON.parse(options.shareInfo)
}

画布的样式

由于在获取临时路劲保存图片的时候用一倍的canvas保存的图片会很模糊,我们需要对canvas画布进行多倍处理,一般二倍即可,太大了在Android上可能会出现问题

也可以以像素比为倍率,这样比较好处理,这里用的是像素比,具体如下

wx.getSystemInfo({
 success (res) {
 // 通过像素比计算出画布的实际大小(330x490)是展示的出来的大小
 this.width = 330 * res.pixelRatio
 this.height = 490 * res.pixelRatio
 }
})
// 结构样式
<canvas class="canvas-poster" id="canvasPoster" :style="{width:width+'px;',height: height+'px'}" canvas-id="canvasPoster"></canvas>
<img :src="poster" class="poster-img" @click="previewImg" alt="">
<div type="button" @click="savePoster" class="save-btn">
 <img src="../img/0.3_btn_yellow_bg.png" alt="">
 <div class="btn-text">保存图片</div>
</div>
.canvas-poster{
 background-color: #fafafa;
 zoom: 50%; // 将画布缩小到50%(最好通过像素比进行缩小,像素比是2的话就是50%,如果不全是以像素比为标准,在生成图片的时候可能会出现四周黑边)
 position: absolute;
 left: -10000px; // 将画布隐藏在可视区域外
 background: #206949;
}

生成之前获取画布信息

mounted () {
 var query = wx.createSelectorQuery()
 query.select('#canvasPoster').boundingClientRect((res) => {
 // 返回值包括画布的实际宽高
 this.drawImage(res)
 }).exec()
}

生成逻辑

methods: {
 drawImage (canvasAttrs) {
 let ctx = wx.createCanvasContext('canvasPoster', this)
 let canvasW = canvasAttrs.width // 画布的真实宽度
 let canvasH = canvasAttrs.height //画布的真实高度
 // 头像和二维码大小都需要在规定大小的基础上放大像素比的比例后面都会 *this.systemInfo.pixelRatio
 let headerW = 48 * this.systemInfo.pixelRatio
 let headerX = (canvasW - headerW) / 2
 let headerY = 40 * this.systemInfo.pixelRatio
 let qrcodeW = 73 * this.systemInfo.pixelRatio
 let qrcodeX = 216 * this.systemInfo.pixelRatio
 let qrcodeY = 400 * this.systemInfo.pixelRatio
 // 填充背景
 ctx.drawImage(this.shareInfo.bgImg, 0, 0, canvasW, canvasH)
 ctx.save()
 // 控制头像为圆形
 ctx.setStrokeStyle('rgba(0,0,0,.2)') //设置线条颜色,如果不设置默认是黑色,头像四周会出现黑边框
 ctx.arc(headerX + headerW / 2, headerY + headerW / 2, headerW / 2, 0, 2 * Math.PI)
 ctx.stroke()
 //画完之后执行clip()方法,否则不会出现圆形效果
 ctx.clip()
 // 将头像画到画布上
 ctx.drawImage(this.shareInfo.headerImg, headerX, headerY, headerW, headerW)
 ctx.restore()
 ctx.save()
 // 绘制二维码
 ctx.drawImage(this.shareInfo.qrcode, qrcodeX, qrcodeY, qrcodeW, qrcodeW)
 ctx.save()
 ctx.draw()
 setTimeout(() => {
 //下面的13以及减26推测是因为在写样式的时候写了固定的zoom: 50%而没有用像素比缩放导致的黑边,所以在生成时进行了适当的缩小生成,这个大家可以自行尝试
 wx.canvasToTempFilePath({
 canvasId: 'canvasPoster',
 x: 13,
 y: 13,
 width: canvasW - 26,
 height: canvasH - 26,
 destWidth: canvasW - 26,
 destHeight: canvasH - 26,
 success: (res) => {
  this.poster = res.tempFilePath
 }
 })
 }, 200)
 },
 previewImg () {
 if (this.poster) {
 //预览图片,预览后可长按保存或者分享给朋友
 wx.previewImage({
 urls: [this.poster]
 })
 }
 },
 savePoster () {
 if (this.poster) {
 wx.saveImageToPhotosAlbum({
 filePath: this.poster,
 success: (result) => {
  wx.showToast({
  title: '海报已保存,快去分享给好友吧。',
  icon: 'none'
  })
 }
 })
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
点击文章内容处弹出页面代码
Oct 01 Javascript
原生javascript实现图片滚动、延时加载功能
Jan 12 Javascript
require.js的用法详解
Oct 20 Javascript
简单的JS轮播图代码
Jul 18 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
May 17 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
Jul 23 Javascript
JavaScript函数中的this四种绑定形式
Aug 15 Javascript
node.js实现的装饰者模式示例
Sep 06 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
Apr 09 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
Mar 07 Javascript
微信小程序学习笔记之文件上传、下载操作图文详解
Mar 29 #Javascript
微信小程序生成二维码的示例代码
Mar 29 #Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
Mar 29 #Javascript
JavaScript实现无限级递归树的示例代码
Mar 29 #Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
Mar 29 #Javascript
详解a标签添加onclick事件的几种方式
Mar 29 #Javascript
node(koa2) web应用模块介绍详解
Mar 29 #Javascript
You might like
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
js数组去重的常用方法总结
2014/01/24 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
ES6的新特性概览
2016/03/10 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
使用Python中的cookielib模拟登录网站
2015/04/09 Python
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
Python算法之图的遍历
2017/11/16 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
Python简单实现控制电脑的方法
2018/01/22 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
python设置值及NaN值处理方法
2018/07/03 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
资产评估专业学生的自我鉴定
2013/11/14 职场文书
年度考核自我鉴定
2014/03/19 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
求职意向书
2014/07/29 职场文书