• 小程序生成海报并保存


    wxml

    <!-- 生成海报二维码并保存到相册 -->
    <view class='cont' id='canvas-container'>
        <canvas canvas-id="myCanvas" style="100%;height:100%;" bindlongtap='saveShareImg' />
      </view>

    wxss

    page {
      background-color: #edeef2;
    }
     
    .cont {
      width: 80%;
      margin: auto;
      text-align: center;
      height: 1000rpx;
      margin-top: 50rpx;
      background:#ff8427;
      box-shadow:0rpx 0rpx  10rpx 5rpx rgb(100, 80, 204);
    }
     
    .savePoste {
      background-color: #ff8427;
      width: 90%;
      margin-left: auto;
      margin-right: auto;
      margin-top: 30rpx;
      color: #fff;
    }
     
    .saveTitle {
      font-size: 25rpx;
      color: #666;
      width: 90%;
      margin-left: auto;
      margin-right: auto;
      margin-top: 20rpx;
      text-align: center;
    }

    js

    // pages/haibao/haibao.js
    //获取应用实例
    const app = getApp()
    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
        name:'大肉丸子',   //生成海报的名字
        cardBase: {
          //需要https图片路径,下载到本地然后去绘制
          cardbg: "../../images/personal/invitation.png",
          // 二维码
          codeImg: "../../images/personal/QR.png",
          avatar:"../../images/personal/avatar.png"
        }
      },
    
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
        var that = this;
        var cardBase=that.data.cardBase;
        that.getCanvas(cardBase.cardbg, cardBase.codeImg,cardBase.avatar);
    
      },
    /**
       * 先下载海报背景
       */
      getAvaterInfo: function() {
        wx.showLoading({
          title: '生成中...',
          mask: true,
        });
        var that = this;
        wx.downloadFile({
          url: that.data.cardBase.cardbg, 
          success: function(res) {
            wx.hideLoading();
            if (res.statusCode === 200) {
              //download下载成功返回结果res.tempFilePath
              var cardbg = res.tempFilePath; 
              that.getQrCode(cardbg); 
            } else {
              wx.showToast({
                title: '亲,海报下载失败!',
                icon: 'none',
                duration: 2000,
                success: function() {
                  var cardbg = "";
                  that.getQrCode(cardbg);
                }
              })
            }
          }
        })
      },
     
      /**
       * 下载二维码图片
       */
      getQrCode: function (cardbg) {
        wx.showLoading({
          title: '生成中...',
          mask: true,
        });
        var that = this;
        wx.downloadFile({
          url: that.data.cardInfo.codeImg,
          success: function(res) {
            wx.hideLoading();
            if (res.statusCode === 200) {
              var codeImg = res.tempFilePath;
              that.getCanvas(cardbg, codeImg);
            } else {
              wx.showToast({
                title: '二维码下载失败!',
                icon: 'none',
                duration: 2000,
                success: function() {
                  var codeImg = "";
                  that.getCanvas(cardbg, codeImg);
                }
              })
            }
          }
        })
        wx.downloadFile({
          url: that.data.cardInfo.avatar,
          success: function(res) {
            wx.hideLoading();
            if (res.statusCode === 200) {
              var avatar = res.tempFilePath;
              that.getCanvas(cardbg, avatar);
            } else {
              wx.showToast({
                title: '头像下载失败!',
                icon: 'none',
                duration: 2000,
                success: function() {
                  var avatar = "";
                  that.getCanvas(cardbg, avatar);
                }
              })
            }
          }
        })
      },
     
      /**
       * 开始用canvas绘制分享海报
       * @param cardbg 下载的海报背景图路径
       * @param codeImg   下载的二维码图片路径
       * @param avatar    下载的头像的图片
       */
      getCanvas: function (cardbg, codeImg,avatar) {
        wx.showLoading({
          title: '正在生成中...',
          mask: true,
        })
        var that = this;
        var cardBase = that.data.cardBase; //需要绘制的数据集合
        const ctx = wx.createCanvasContext('myCanvas'); //创建画布
        var width = "";
        wx.createSelectorQuery().select('#canvas-container').boundingClientRect(function(rect) {
          var height = rect.height;
          var right = rect.right;
          width = rect.width * 0.8;
          var left = rect.left + 5;
          ctx.setFillStyle('#fff');
          ctx.fillRect(0, 0, rect.width, height);
          // 这里处理自适应
          let rpx = 1;
          wx.getSystemInfo({
            success(res) {
              rpx = res.windowWidth / 375;
            },
          })
     
          //背景图
          if (cardbg) {
            ctx.drawImage(cardbg, 20*rpx,20*rpx, 260*rpx,460*rpx);
          }
        // 标题
          ctx.setFontSize(14);
          ctx.setFillStyle('#000');
          ctx.setTextAlign('left');
          ctx.fillText(that.data.name, 80 * rpx, 70 * rpx, 100 * rpx, 100 * rpx); //姓名
          //  绘制二维码
          if (codeImg) {
            ctx.drawImage(codeImg, 185 * rpx, 362 * rpx, 55 * rpx, 55 * rpx)
          }
          if(avatar){
            ctx.drawImage(avatar, 40 * rpx, 50 * rpx, 33 * rpx, 33 * rpx)
          }
     
        }).exec()
     
        setTimeout(function() {
          ctx.draw();
          wx.hideLoading();
        }, 1000)
     
      },
     
     
      //点击保存到相册
      saveShareImg: function() {
        var that = this;
        wx.showLoading({
          title: '正在保存',
          mask: true,
        })
        setTimeout(function() {
          wx.canvasToTempFilePath({
            canvasId: 'myCanvas',
            success: function(res) {
              console.info("res", res);
              wx.hideLoading();
              var tempFilePath = res.tempFilePath;
              wx.saveImageToPhotosAlbum({
                filePath: res.tempFilePath,
                success(res) {
                  console.info(res);
                  wx.showModal({
                    content: '图片已保存到相册,赶紧晒一下吧~',
                    showCancel: false,
                    confirmText: '好的',
                    confirmColor: '#333',
                    success: function(res) {
                      if (res.confirm) {}
                    },
                    fail: function(res) {}
                  })
                },
                fail: function(res) {
                  console.log(res)
                  if (res.errMsg === "saveImageToPhotosAlbum:fail:auth denied") {
                    console.log("打开设置窗口");
                    wx.openSetting({
                      success(settingdata) {
                        console.log(settingdata)
                        if (settingdata.authSetting["scope.writePhotosAlbum"]) {
                          console.log("获取权限成功,再次点击图片保存到相册")
                        } else {
                          console.log("获取权限失败")
                        }
                      }
                    })
                  }
                }
              })
            }
          });
        }, 1000);
      },
    
    })

     注意:canvas不能使用网络地址

    解决方法:用wx.downloadFile()方法下载图片,然后就可以使用显示在海报上啦。

  • 相关阅读:
    C# 调用Java Webservice 加入SoapHeader 验证信息
    SqlServer查找表中多余的重复记录
    INI文件的读写
    Sql触发器脚本
    Sql遍历更新脚本
    CAS 单点登录,通过ticket 获取登录用户
    模块 | 验证格式
    aja如何解决跨域请求?
    说说各个浏览器box模型
    Vue 双向数据绑定原理分析
  • 原文地址:https://www.cnblogs.com/meiyanstar/p/13208267.html
Copyright © 2020-2023  润新知