zoukankan      html  css  js  c++  java
  • 微信小程序-canvas绘制图片

    由于小程序无法分享到朋友圈,所以想分享到朋友圈的话,我们只能生成一张海报了。

    这时,我们就要用canvas来绘制图片

    一、创建canvas容器

    // 展示图片,并保存到本地
    <view class='imagePathBox' v-if="showPoster"> <image v-if="imagePath" :src="imagePath" class='shengcheng'></image> <view v-if="imagePath == ''" class="poster_ing">海报生成中...</view> <view class='baocun' @tap='baocun'>保存相册,分享到朋友圈</view> <image src="/static/icon_oc_close.png" class="post_close" @tap="closePoster"></image> </view>
    // canvas容器 <view class="canvas-box"> <canvas style=" 375px;height: 667px;position:fixed;top:9999px" canvas-id="mycanvas" /> </view>

    二、服务端获取小程序二维码

    为什么说是服务端获取小程序码呢,因为微信公众平台是不允许将 https://api.weixin.qq.com 域名绑定到服务请求白名单中的

    getCode: function() {
      let that = this
      let channelId = compress(app.globalData.channelId)
      let custId = compress(this.custInfo.custId)
      let customId = compress(that.customId)
      let str = channelId + '/' + custId + '/' + customId
     // 这里需要说明下,scene是page后接的参数,而且有效长度为32位,超过是无法生码的,所以一定要控制长度
    // 因为我要传递的参数刚好是纯数字,所以我的方法是把原来的十进制转化成了32进制,在取参的时候再转化下即可
    // 当然如果需要的数据量比较大话,也可以将数据存到后台,只把id传过去即可
     // accessToken的获取可以看下微信小程序的API uni.request({ url:
    'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=' + this.accessToken, data: { scene: str, page: "pages/personal/routerSharePage/routerSharePage" }, method: "POST", responseType: 'arraybuffer', //设置响应类型 success(res) {
        // 转化为base64位
    var codeSrc = uni.arrayBufferToBase64(res.data); //对数据进行转换操作 that.setData({ codeSrc: codeSrc }) that.createNewImg() }, fail(e) { console.log(e) } }) },

    三、绘制canvas

    createNewImg: function() {
      var that = this;
     // 因为base64不能直接生成图片,所以需要转成本地图片 let pathCode
    = "data:image/png;base64," + this.codeSrc const fsm = wx.getFileSystemManager(); const FILE_BASE_NAME = 'tmp_base64src'; const [, format, bodyData] = /data:image/(w+);base64,(.*)/.exec(pathCode) || [] const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`; const buffer = wx.base64ToArrayBuffer(bodyData); fsm.writeFileSync( filePath, buffer, 'binary')
    /* 创建容器 */ var context = uni.createCanvasContext('mycanvas'); /* 主体背景色 */ context.setFillStyle("#ffffff") /* 背景色填充区域 */ context.fillRect(0, 0, 375, 667) //将模板图片绘制到canvas,在开发工具中drawImage()函数有问题,不显示图片 context.drawImage(this.headerImg, 0, 0, 375, 421); /* 绘制标语 */ let text1 = '我的线路我做主' let text2 = '我是线路合伙人,为我助力吧' context.setFontSize(24) context.setFillStyle("#181818") context.setTextAlign('center') context.fillText(text1, 185, 467) context.stroke() context.setFontSize(18) context.setFillStyle("#4D4D4D") context.setTextAlign('center') context.fillText(text2, 185, 500) context.stroke() /* 画虚线 */ context.lineWidth = 3 context.strokeStyle = "#4D4D4D" context.beginPath() context.setLineDash([18.5, 4]) context.moveTo(37.5, 525) context.lineTo(337.5, 525) context.stroke() /* 小程序二维码 */ context.drawImage(filePath, 41, 547, 82, 82); /* 小程序描述 */ let text3 = '分享来自北京定制公交升级版' let text4 = '长按识别小程序立即参与' context.setFontSize(15) context.setFillStyle("#181818") context.setTextAlign('left') context.fillText(text3, 140, 579) context.stroke() context.setFontSize(14) context.setFillStyle("#4D4D4D") context.setTextAlign('left') context.fillText(text4, 140, 610) context.stroke() context.draw(); //将生成好的图片保存到本地,需要延迟一会,绘制期间耗时 setTimeout(function() { uni.canvasToTempFilePath({ canvasId: 'mycanvas', success: function(res) {    var tempFilePath = res.tempFilePath; uni.hideLoading() that.setData({ imagePath: tempFilePath, showPoster: true }); }, fail: function(res) { console.log(res); } }); }, 200);
    },

    四、保存图片

    baocun: function() {
       uni.showLoading({
          title: '正在下载',
       })
       if (this.imagePath.indexOf('https') > -1) {} else {
          this.imagePath = this.imagePath.replace('http', 'https')
        }
        uni.saveImageToPhotosAlbum({
           filePath: this.imagePath,
           success(res) {
             uni.showModal({
                content: '图片已保存到相册,赶紧晒一下吧~',
                showCancel: false,
                confirmText: '好的',
                confirmColor: '#333',
                success: function(res) {
                  if (res.confirm) {
                     uni.hideLoading()
                  }
                },
                fail: function(res) {
                   console.log(11111)
                }
             })
           }
        })
      },

    ok,这样就可以了,有问题可以留言

  • 相关阅读:
    WIN7中易语言的显示问题
    Win8关闭metro UI的方法汇总
    Win8快速更改输入法不习惯问题
    win7 win8和谷歌浏览器内核的抓包工具
    运算符重载复习
    1002
    [STL] 成员函数VS算法函数
    ACM448
    nuaa acm 1138
    怎么呢...
  • 原文地址:https://www.cnblogs.com/WQLong/p/12746379.html
Copyright © 2011-2022 走看看