微信小程序使用canvas画布生成二维码海报分享图片(后端给的base64格式图片转换为ArrayBuffer再生成海报)

页面效果

微信小程序使用canvas画布生成二维码海报分享图片(后端给的base64格式图片转换为ArrayBuffer再生成海报)_第1张图片

index.wxml


  
      
  
  
  
   分享二维码给好友,快去分享吧
  
  
  
		
			
		
   
 

index.js

import request from '../../../../resquest/request'
import {
  base64src
} from '../../../../utils/base64src.js'

const W = wx.getSystemInfoSync().windowWidth;
const rate = 750.0 / W;
let qrcode;
// 300rpx 在6s上为 150px
const qrcode_w = 300 / rate;
Page({

  /**
   * 页面的初始数据9
   */
  data: {
    qrcode_w: qrcode_w,
    bool: false,
    qrcode: '', //二维码路径
    back_url: '',  // 背景图片路径
    canvasType: false, //canvas是否显示
    imagePath: '', //合成图片地址
    _width: 0,
    _heigth: 0,
    uploadUrl: wx.getStorageSync('uploadUrl'),
  },


  onShareAppMessage: function (res) {
    let id = 1
    // 新版分享后不进行回调了
    return {
      title: '分享',
      path: '/pages/maintainTab/personalManagement/sharePage',
      // imageUrl: '', // 分享界面的图片
      success: function (res) {
        // 转发成功之后的回调

      },
      fail: function (res) {
        // 分享失败

      },
    }
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

    // 背景图地址
    this.setData({
      back_url: this.data.uploadUrl + 'icon/qyxx_phbj.png'
    })
  },
  
  // 获取后台二维码
  getOrgSharEwm(){
    let that = this
    request._get('/ws/api/wx/ma/getOrgSharEwm', null, res => {
      if(res.result){
        that.translateBase64(res.result)
      }
    }, err => {
      console.log(err)
    })
  },

  // 将后台生成的base64码转成图片地址
  translateBase64(code){
    let that = this
    base64src(code, res => {
      console.log('base64src返回的数据', res) // 返回图片地址,直接赋值到image标签即可
      that.setData({
        qrcode: res
      })
      // 下载背景图
      wx.downloadFile({
        url: this.data.back_url, 
        success: function (res) {
          if (res.statusCode === 200) {
            that.setData({
              back_url: res.tempFilePath
            })
            // 生成海报方法调用
            that.getSystem()
          }
        }
      })
      // 下载二维码
      wx.downloadFile({
        url: that.data.qrcode, 
        success: function (res) {
          if (res.statusCode === 200) {
            that.setData({
              qrcode: res.tempFilePath
            })
          }
        }
      })
    });
  },

  // 获取手机宽高
  getSystem() {
    let that = this
    wx.getSystemInfo({
      success(res) {
        that.setData({
          _width: res.windowWidth,
          _heigth: res.windowHeight,
          canvasType: true,
        })
        
        that.drawCanvas(res.windowWidth, res.windowHeight)
      }
    }) 
  },

  // 绘制canvas
  drawCanvas(_width,_heigth){
    let that = this
    let screen_width = this.data._width / 375  // 手机宽度比例,以6s为参考
    var context = wx.createCanvasContext('shareCanvas'); // 绘制背景
    context.setFillStyle("#eee");
    context.fillRect(20, 100, 0, 500);
    //背景图片
    var back_url = that.data.back_url

    //公司名
    var orgName = wx.getStorageSync('orgName')
    
    //二维码
    var qrcode = that.data.qrcode

    //背景图片
    context.drawImage(back_url, _width / 15, _heigth / 51, 332 * screen_width, 420 * screen_heigth)

    //写入文字-公司名称
    context.setTextAlign('center') // 文字居中
    context.setFillStyle('#ffffff') // 文字颜色:白色
    context.setFontSize(22) // 文字字号:22px
    context.fillText(orgName, _width / 2, _heigth / 5)
    // 写入二维码
    context.drawImage(qrcode, _width / 3.2, _heigth / 4.5, 150 * screen_width, 150 * screen_width)
    
    context.fill()
    // context.stroke()
    context.draw()

    //将生成好的图片保存到本地,需要延迟一会,绘制期间耗时
    setTimeout(function () {
     that.canvasToTempFilePath()
    }, 200)
  },

  /**
   * 把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径
   */
  canvasToTempFilePath(){
    let that = this
    wx.canvasToTempFilePath({
      canvasId: 'mycanvas',
      success: function (res) {
        var tempFilePath = res.tempFilePath;
        that.setData({
          imagePath: tempFilePath,
          canvasHidden: true
        });
      },
      fail: function (res) {
        console.log(res);
      }
    });
  },

  // 保存图片
  saveImage() {
    var that = this
    if (that.data.imagePath) {
      wx.saveImageToPhotosAlbum({
        filePath: that.data.imagePath,
        success() {
          that.setData({
            showShareImg: false
          })
          wx.showToast({
            title: '图片保存成功,快去分享到朋友圈吧~',
            icon: 'none',
            duration: 2000
          })
        },
        fail() {
          wx.showToast({
            title: '保存失败',
            icon: 'none'
          })
        }
      })
    } else {
      wx.showLoading({
        title: '请先等待图片生成再保存',
      })
      setTimeout(
        () => {
          wx.hideLoading()
        }, 1000)
    }

  },


  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    this.getOrgSharEwm()
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
    this.onShareTimeline()

  },
  onShareTimeline: function () {

  }
})

base64转换为ArrayBuffer (base64src.js)



function base64src(code, cb) {

  // 获取文件管理器
  const fsm = wx.getFileSystemManager();
  
  const timestamp = Date.parse(new Date())

  // 自定义文件名
  const FILE_BASE_NAME = 'tmp_base64src' + timestamp

  // 文件系统中的用户目录路径 (本地路径)
  const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.png`;

  // 将 base64 字符串转成 ArrayBuffer 对象
  const buffer = wx.base64ToArrayBuffer(code)
 //异步写入文件(时间会长一些)
  fsm.writeFile({
    filePath: filePath,
    data: buffer,
    encoding: 'base64',
    success() {
      cb(filePath)
    },
    fail() {
      return (new Error('ERROR_BASE64SRC_WRITE'));
    },
    complete(){
      console.log('complete')
    }
  });
//同步写入文件
  // fsm.writeFileSync(
  //   filePath,
  //   buffer,
  //   'base64'
  // )
  // cb(filePath)
};

export { base64src };

你可能感兴趣的:(小程序,小程序)