上条博客已经介绍了如何云调用生成小程序码,链接地址:
https://blog.csdn.net/mingjuna2010/article/details/92796711
这条博客我们来介绍小程序中怎么生成长图,如何预览,并且在长图中绘制小程序码,以及小程序码中间的默认logo换成自定义logo。
①首先在页面上 index.wxml 准备一个画布,画布的宽度设定,高度不定。由于高度不定,所以预览时画布是不显示在页面上的,只提供画图功能,显示在页面上的是image标签,外层使用swiper-view,进行长图的上下滑动预览,视觉效果加上蒙层,代码如下:
!-- 显示在页面上的image标签,即长图 --scroll-view class="temp_day_box" style='max-height:900rpx;' scroll-y wx:if="{{sharing}}" view image class="canvas_img" style='height:{{height*2}}rpx' src='{{shareImgSrc}}'/image /view/scroll-view!--显示长图是背景变暗,即蒙层--view class="mask" catchtap='shareStop' catchtouchmove='preventTouchMove' wx:if="{{sharing}}"/view!-- 不显示在页面上的画布--canvas class='canvasHigh' style="height:{{height*2}}rpx" canvas-id='share'/canvas②在index.js文件中的data里面定义相应的参数,代码如下:
data: { height: '', //长图的高度 sharing:false, //控制长图是否显示 shareImgSrc:'', //最终长图(包括背景图,换过中间logo的小程序码) shareDocuments:'' //后端获取的长图的背景图 }, // 蒙层关闭事件 shareStop() { this.setData({sharing: false}) },③在index.wxss里面添加画布样式,此时画布是不显示在页面上的,只是提供画图的功能,所以样式中设置了画布的宽度,并且使用固定定位将其移出屏幕,代码如下:
.canvasHigh { position: fixed; left: -9999rpx; top: -9999rpx; width: 600rpx;}.temp_day_box { width: 600rpx; position: fixed; top: 100rpx; left: 10%; z-index: 999;}.canvas_img { width: 600rpx;}④以上三步准备工作已经就绪,接下来就详细讲述shareImgSrc怎么产生的,index.js代码如下:
// 长图+二维码显示 drawPage() { let _this = this // 获取图片信息(宽高) wx.getImageInfo({ src: this.data.shareDocuments[0].url, //这是长图的背景图,从服务端获取,这里就不详细赘述 success(res) { _this.setData({ height: res.height, //背景图的高度 width: res.width //背景图的宽度 }) const ctx = wx.createCanvasContext("share"); //获取上下文对象 ctx.drawImage(res.path, 0, 0, 300, _this.data.height); //绘制背景图 let that = _this wx.getImageInfo({ src: that.data.code, //之前获取的小程序码 success(res) { ctx.drawImage(res.path, 150, that.data.height - 150, 125, 125); //绘制小程序码 let index = that wx.getImageInfo({ src: index.data.orgLogo, //需要替换的logo,从服务端获取,这里就不详细赘述 success(res) { console.log("绘制中间logo") ctx.beginPath() //开始创建一个路径 ctx.setStrokeStyle('rgba(0,0,0,0)') //画笔颜色换成透明 ctx.arc(212.5, index.data.height - 87.5, 31.25, 0, 2 * Math.PI, false) //画一个圆形裁剪区域 ctx.stroke(); ctx.clip() //裁剪 ctx.drawImage(res.path, 181.25, index.data.height - 118.75, 62.5, 62.5); //绘制小程序码中间logo //最后将所有的绘制好的图片画出来,注意如果不需要保存的长图,可以直接ctx.draw(),但是需要保存的长图,需要先调用wx.canvasToTempFilePath这个API。 ctx.draw(true, function () { wx.canvasToTempFilePath({ x: 0, y: 0, width: 300, height: that.data.height, destWidth: 300, destHeight: that.data.height, canvasId: 'share', success(res) { that.setData({ shareImgSrc: res.tempFilePath }) } }) }); } }) } }) } }) },⑤接下来讲述一下如何保存长图,这个就比较简单了,index.js代码如下:
// 保存长图 saveLongImage(){ let _this = this wx.saveImageToPhotosAlbum({ filePath: _this.data.shareImgSrc, success(res) { wx.showToast({ title: '保存成功', icon: 'success',})//保存长图成功之后,1.5s之后关闭蒙层和长图 setTimeout(function () { _this.shareStop() }, 1500) } }) },













