一、制作前的说明

上一篇文章讲了微信官方提供的动态生成小程序码的一些说明与注意事项。
本篇文章就带大家一起把绘制带参小程序码的宣传海报给画出来以及如何保存已经生成的小程序码,方便下次复用。
注意: 上一篇文章有说到,小程序要生成小程序码的话,小程序必须是已经上线了。所以为了方便,本文使用的小程序码数据(base64格式)是我从别的小程序copy过来的,真实项目中,其实也是一样的写法,有些部分我会使用伪代码来作为说明。

二、制作所需要的工具

微信官方提供的Canvas组件,谁用谁知道,所以作为小白的我还是决定使用大佬开发好的轮子吧。

工具一:Painter

painter是一个可以以很方便生成图片,并且还能屏蔽掉直接使用 Canvas 的一些坑的库,原理如下:
painter定义了一套绘图 JSON 规范,开发者可以根据需求构建生成图片的 Palette(调色板),然后在程序运行过程中把调色板传入给 Painter(画家)。Painter 会调用 Pen(画笔),根据 Palette 内容绘制出对应的图片后返回。
上面是在Paninter的github说明上搬过来的,还有更多的介绍详情就不介绍了,大家可以自行前往查阅。
Painter的gihub地址

工具二:生成JSON数据

Painter的简介里说到:painter定义了一套绘图 JSON 规范,所以方便开发者能够快速根据需求生成这套JSON数据,又有大神开发了一款工具。
这个工具可以通过可视化的操作,把海报的相关数据转成painter所需要的JSON数据。
使用相对来说比较简单,这里就不再详细介绍了。图片网络路径可以将图片上传到小程序的云存储里获的https链接。
生成后,点击复制代码/导出JSON备用。
PS:在某些网络情况下可能会打不开,多刷新几次,还是不行又特别急的话,就只能自己手撸代码了

三、实现原理与代码

实现原理

微信接口返回的小程序码并不是图片格式,而是arrayBuffer格式的数据。这个数据是无法被存储下来的,Painter目前也无法实现通过buffer数据绘制出图片。
所以要实现存储以及使用Painter绘制海报的话就要将buffer格式的数据转成base64格式的数据。
当然,painter也无法根据base64格式的数据绘制图片。所以需要将base64格式的数据转换成图片,并储存在小程序的临时文件路径里面,再将这个临时路径传给painter进行绘制。

实现代码

1、引入painter库

前往github把代码下载下来后,解压打开。进入components文件夹,将painter这个文件夹复制粘贴到小程序的components文件夹内。


2、引用Painter组件

在页面的*.json中引用Painter的组件。

3、wxml代码
<!-- canvas隐藏 -->
<painter customStyle='position: absolute; left: -9999rpx;' customActionStyle="{{customActionStyle}}"dancePalette="{{template}}" palette="{{paintPallette}}" bind:imgOK="onImgOK" bind:touchEnd="touchEnd"action="{{action}}" use2D="{{true}}" widthPixels="520" />
<!-- canvas隐藏 -->
<image class="poster-img" src="{{posterUrl}}"></image>
<button type="primary" bindtap="makePoster">生成海报</button>
4、wxss代码
.poster-img{background-color: #bebebe;height: 600rpx;width: 450rpx;margin: 45rpx auto;
}

效果如下

5、JS代码

通过实现原理可以知道,要想实现绘制小程序码的海报并储存小程序码进行复用,有两个问题:
1、将arrayBuffer数据转换成图片并保存到临时路径里。
2、把arrayBuffer转成base64格式保存在云数据库。
先说第二个问题,因为很好解决,微信小程序就有提供一个API给我们将arrayBuffer的数据转换成base64。代码如下:

const base64 = wx.arrayBufferToBase64(buffer)

这样我们就得到了一个base64格式的数据,我们只需要把它存储到数据库里即可。
然后我们来看看第一个问题,如何将arrayBuffer数据转换成图片并保存到临时路径里呢?
看代码:

  /** 将小程序码的ArrayBuffer转换成临时图片路径 */getQRCodeImg(arrayBuffer) {const fs = wx.getFileSystemManager()  // 获取文件管理器实例const hash = new Date().getTime() // 随机文件名const filePath = wx.env.USER_DATA_PATH + "/" + hash + ".jpg" // 临时路径// 将arrayBuffer写入缓存中,并返回文件路径return new Promise((resolve, reject) => {fs.writeFile({filePath: filePath,data: arrayBuffer,encoding: 'binary',success(res) {resolve(filePath)},fail(err) {console.log('getQRCodeImgErr --- ', err)}})})}

OK,两个关键问题都得以解决了,那接下来看看完整的实现代码吧。在小程序主文件夹下新增一个文件夹palette,用于存放绘图的JSON数据以及实例。

完整JS代码

// pages/index/index.js
import poster from '../../palette/painter';const db = wx.cloud.database()Page({/*** 页面的初始数据*/data: {posterUrl: "",paintPallette: ""},/*** 生命周期函数--监听页面加载*/onLoad: function (options) {},/** 绘制完成后的回调函数*/ onImgOK(res) {wx.hideLoading({success: (res) => {},})// 这个路径就可以作为保存图片时的资源路径console.log("海报临时路径", res.detail.path)this.setData({posterUrl: res.detail.path})},/** 生成按钮点击 */async makePoster() {wx.showLoading({title: '绘制中',})var QRCodeUrl = nullvar buffer = nullvar QRCodeBase64 = null// 背景图片Url(可以放到云存储中获取路径,必须是https类型)var bgImg = "XXXXXXX"// 获取小程序码数据// 如果是从微信接口获取,可以省略这步var QRCodeDataObj = await this.getQRCodeData()// 实际项目中,这里应该判断一下是否为空,如果不存在,则从微信官方接口获取QRCodeBase64 = QRCodeDataObj.data[0].QRCodeData// 将base64转成buffer// 同理 如果是从微信接口获取,可以省略这步buffer = wx.base64ToArrayBuffer(QRCodeBase64)// 存到临时文件里QRCodeUrl = await this.getQRCodeImg(buffer)// 这是绘制海报所用到JSON数据const viewList = {"width": "450px","height": "798px","background": "#f8f8f8","views": [{"type": "image","url": bgImg,"css": {"width": "450px","height": "798px","top": "0px","left": "0px","rotate": "0","borderRadius": "","borderWidth": "","borderColor": "#000000","shadow": "","mode": "scaleToFill"}},{"type": "image","url": QRCodeUrl,"css": {"width": "95px","height": "95px","top": "675px","left": "346px","rotate": "0","borderRadius": "","borderWidth": "","borderColor": "#000000","shadow": "","mode": "scaleToFill"}}]}this.setData({paintPallette: new poster().palette(viewList)})},/** 将小程序码的ArrayBuffer转换成临时图片路径 */getQRCodeImg(arrayBuffer) {const fs = wx.getFileSystemManager() // 获取文件管理器实例const hash = new Date().getTime() // 随机文件名const filePath = wx.env.USER_DATA_PATH + "/" + hash + ".jpg" // 临时路径// 将arrayBuffer写入缓存中,并返回文件路径return new Promise((resolve, reject) => {fs.writeFile({filePath: filePath,data: arrayBuffer,encoding: 'binary',success(res) {resolve(filePath)},fail(err) {console.log('getQRCodeImgErr --- ', err)}})})},/** 从云数据库获取小程序码的base64数据* 由于示例小程序没有上线* 无法生成小程序码* 所以我从其他小程序copy了一段* 由buffer转成base64的数据*/getQRCodeData() {return new Promise((resolve, reject) => {db.collection('QRCode').get().then(res => {resolve(res)}).catch(err => {console.log(err)})})},})
6、运行效果

四、 结尾

由于篇幅关系,存储复用的详细代码就不写了,直接将buffer数据转成base64存到数据库,取得时候根据openid来取即可。没有的话就生成新的再存。
ps:本人技术有限,正在学习中,如果博客中有什么写得不恰当之处,还望大佬赐教。

另外本人承接小程序制作、二次开发、维护、毕设等,有需要的可以联系我。

实战篇-制作微信小程序码宣传海报相关推荐

  1. 实用工具证件照制作微信小程序源码

    这是一款证件照制作的微信小程序,里面也支持直接微信公众号版本生成安装 支持多种尺寸制作 支持相册上传于直接相机拍摄 支持电子照存档等等 拥有小程序推荐功能,可以给其它的小程序实现引流 另外还支持换装美 ...

  2. 全新实用工具证件照制作微信小程序源码下载支持多种证件生成与制作

    这是一款证件照制作的微信小程序,里面也支持直接微信公众号版本生成安装 支持多种尺寸制作 支持相册上传于直接相机拍摄 支持多种类型的证件制作如,职业证件,公务员证件,身份证等各种类型 支持电子照存档等等 ...

  3. 小程序源码:百变头像框制作微信小程序源码下载,免服务器和域名

    这是一款头像框制作的微信小程序源码 支持多种模板制作! 如一些热门的,王者头像框,国旗头像框,职业头像框等等 这一款小程序是免服务器和免域名的 所以也就是说这是一款纯前端的一款微信小程序源码 无需设置 ...

  4. 小程序源码:2022虎年全新头像框制作微信小程序源码下载-多玩法安装简单

    给大家带来一款以2022虎年为主的一款头像制作小程序源码 内包含了虎年虎娃框,2022元旦新年框,国庆几种分类 每一种分类都包含了多种模板制作 虎娃的小编个人感觉那个卡通也是挺可爱的! 另外整个小程序 ...

  5. 小程序源码:2022虎年背景全新UI头像框制作微信小程序源码下载-多玩法安装简单

    内包含了虎年虎娃多种分类头像框模板,全是和2022虎年有关 每一种分类都包含了多种模板制作 虎娃的小编个人感觉那个卡通也是挺可爱的! 另外整个小程序的背景UI都是以虎年为背景,所以总体的感觉还是很不错 ...

  6. 2022虎年全新头像框制作微信小程序源码下载

    2021马上就结束了,2022也马上到来了,虎年降至 给大家带来一款以2022虎年为主的一款头像制作小程序源码 内包含了虎年虎娃框,2022元旦新年框,国旗框,国庆几种分类 每一种分类都包含了多种模板 ...

  7. 微信小程序+公众号的流量主收入图在线制作微信小程序源码

    微信小程序+公众号的流量主收入图在线制作微信小程序源码,这是一款流量主制作生成小工具,支持小程序流量主图制作生成,也支持公众号的流量主制作生成. 每一种制作都包含了所有的 流量主 模式,用户自己填写选 ...

  8. 都2020年,开发制作微信小程序商城,需要准备什么资料?应该不会不知道吧!

    微信小程序使用越来越广泛,而还未入局的对于微信小程序开发需要什么材料甚至不清楚,其实这些材料很简单.总结就是微信支付.微信小程序注册.小程序代码,下面展开说说. 小程序红利 从腾讯刚发布的财报看,微信 ...

  9. 谷歌开发者大会焦点:TensorFlow.js可制作微信小程序,Android 10原生支持5G,TF2.0大更新...

    2016 年谷歌开发者大会在中国首次举办,2017 年谷歌宣布成立"AI 中国研发中心",2018年谷歌的"AI+小程序"的产物"猜画小歌" ...

最新文章

  1. 程序员笔记|如何编写优雅的Dockerfile
  2. nginx特定的 404页面利于seo
  3. Karma和Jasmine 自动化单元测试环境搭建
  4. 开源 .Net 让微软拥有更多开发者
  5. jquery学习手记(1)
  6. 04 | 深入浅出索引(上)
  7. 在Python中操纵json数据的最佳方式
  8. 一个菜鸟程序员的游戏开发心得
  9. rest模式get,post,put,delete简单讲解
  10. FB接连出事儿?上亿用户记录在亚马逊云服务器上就公之于众了……下滑到第七?领英说苹果怎么就不受雇员欢迎了呢? | 极客头条...
  11. python while无限循环、人为终止_Python while while循环永远不会停止,即使它应该
  12. Oracle数据库中文乱码问题
  13. 字符串模式匹配(bf+KMP)
  14. vue3使用vite创建项目【2分钟】
  15. jQuery EasyUI API 中文文档 - ValidateBox验证框
  16. mysql 登录及常用命令
  17. linux rtl8188eu ap模式 密码错误 disassoc reason code(8)
  18. php 数据库备份还原
  19. Jquery 中 ajaxSubmit使用笔记
  20. Linux下mongodb用户管理和设置远程登陆

热门文章

  1. 软考-信息系统项目管理师-项目沟通管理和干系人管理
  2. 安卓桌面软件_装bi小神器,让你的手机变成电脑桌面
  3. python生成日历_Python创建日历实例代码
  4. 地震波作用下单自由度体系的 Bouc-Wen-Baber-Noori滞回模型求解
  5. java校验视频文件格式
  6. Android 图片选择框架ImageSelector适配Android10及以上
  7. Java中System.loadLibrary() 的执行过程
  8. CPU世上最全说明解析
  9. 如何使用MSN Chat Monitor Sniffer?
  10. 无法安装32位版本的Office,因为在您的PC上找到了以下64位程序