Canvas绘制base64格式图片(vue+微信小程序)

1,657 阅读1分钟

我正在参加「掘金·启航计划」。

不管是原生js的canvas方法还是微信小程序的canvas,都不支持直接绘制base64格式图片,但可以经过转换后进行绘制。

vue

关键代码:

<template>
  <canvas class="canvas" id="canvas" width="375" height="667"></canvas>
</template>

<script>
import axios from 'axios'

export default {
  mounted() {
    this.initCanvas()
    this.drawBase64Img()
  },
  methods: {
    /**
     * 初始化画布
     */
    initCanvas() {
      this.canvas = document.getElementById('canvas')
      this.canvasCtx = this.canvas.getContext('2d')
    },
    /**
     * 获取二维码
     */
    drawBase64Img () {
      axios.get(`${请求url}`, {
      })
        .then(res=> {
          if (res?.data) {
            let imgbase64 = res.data // 接口返回的base64图片数据
            let img = new Image()
            img.crossOrigin = 'anonymous'
            img.src = 'data:image/jpeg;base64,' + imgbase64
            img.onload = () => { 
              this.canvasCtx.drawImage(img, 0, 0 , 100, 100);
            }
            img.onerror = (e) => { 
              self.$message('下载base64图片失败')
            }
          }
        }).catch(err => {
          console.log(err)
        })
    }
  }
}
</script>

小程序

关键代码:

export function getBase64Img () {
  return new Promise((resolve, reject) => {
    wx.request({
      url: `${请求url}`,
      success: (res) => {
        const { data } = res.data || {}
        return getBase64File(data).then(resolve).catch(reject)
      },
      fail: (error) => {
        reject(error)
      }
    })
  })
}

export function getBase64File (base64Str) {
  return new Promise((resolve, reject) => {
    const fsm = wx.getFileSystemManager()  // 文件管理器
    const  FILE_BASE_NAME = `tmp_base64src_${base64Str.substring(0, 6)}` // 文件名
    const  format = 'png' // 文件后缀
    const  buffer = wx.base64ToArrayBuffer(base64Str) // base 转二进制
    const  filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}` // 文件名

    fsm.writeFile({ // 写文件
      filePath,
      data: buffer,
      encoding: 'binary',
      success: (res) => {
        wx.getImageInfo({ // 读取图片
          src: filePath,
          success: (res) => {
            // console.log(res)
            if (res?.path) {
              resolve(res.path)
            } else {
              reject(res)
            }
          },
          error: (res) => {
            reject(res)
          }
        })
      }
    })
  })
}



const ctx = wx.createCanvasContext('canvas'), //canvas
getBase64Img.then(path => {
    //画图
    ctx.drawImage(path, 0, 0, 100, 100) 
    ctx.draw()
})