评论

微信小程序base64图片 canvas 画布 drawImage 实现分享海报

将base64图片使用canvas 画布 drawImage 实现分享海报

在微信小程序中 canvas drawImage API 传入的第一个参数是图片资源路径,这个参数通常由wx.chooseImage 或 wx.getImageInfo 获取图片信息来获得。

而 base64 格式图片数据,无法被 getImageInfo 直接调用,以下是解决方案:

  1. 首先使用 wx.base64ToArrayBuffer 将 base64 数据转换为 ArrayBuffer 数据
  2. 使用 FileSystemManager.writeFile 将 ArrayBuffer 数据写为本地用户路径的二进制图片文件
  3. 此时的图片文件路径在 wx.env.USER_DATA_PATH 中, wx.getImageInfo 接口能正确获取到这个图片资源并 drawImage 至 canvas 上

以下是具体的转换代码:
  getImgCode(url) {
   //自己接口获取base64图片
   let res = await this.$http.post(’/WeixinMin/getEqr’, {
    pages: url
   })
   if (res.code == 1) {
    const fsm = wx.getFileSystemManager();
    const FILE_BASE_NAME = ‘tmp_base64src’;
    const filePath = ${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME};
    //base64 数据转换为 ArrayBuffer 数据
    const buffer = wx.base64ToArrayBuffer(res.data.image);
    fsm.writeFile({
     filePath: filePath,
     data: buffer,
     encoding: ‘binary’,
     success: () => {
      console.log('写入成功, 路径: ', filePath);
     },
     fail: err => {
      console.log(“失败******”, err);
     },
    });
   }
  }

最后一次编辑于  2020-06-08  
点赞 2
收藏
评论

7 个评论

  • 没有对你笑别和我闹.
    没有对你笑别和我闹.
    2023-02-08

    目前可以使用canvas.createImage生成image对象来解决canvas导入base64图片的问题,相对来说简单多了,目前测试有效。

    wx.createSelectorQuery()
        .select('#canvas')
        .fields({ nodetruesizetrue })
        .exec((res) => {
            const canvas = res[0].node
            const ctx = canvas.getContext('2d');
            let img = canvas.createImage(); // 注意是使用canvas实例 不是ctx
            img.src = base64String; // 带编码的头信息的base64字符串    data:image/png;base64,xxx
            img.onload = () => {
              ctx.drawImage(img, 1000100100);
            }
          })
        }
    
    2023-02-08
    赞同
    回复 2
    • 68
      68
      04-17
      微信小程序模拟器是可以实现的 但是到真机就不行了 base64图片无法在canvasz中画出来
      04-17
      回复
    • 一
      04-29回复68
      我也遇到了这个问题,模拟器可以手机上就不行了。。。有没有解决方案。。
      04-29
      回复
  • garfield
    garfield
    2022-07-19

    亲测之后发现,其实不使用了wx.base64ToArrayBuffer也是没问题的,文档里说基础库2.4.0以后停止维护,可能以后版本不支持了,所以简化了操作,直播把base64的数据传到data就行了。

    2022-07-19
    赞同
    回复
  • 等等等===
    等等等===
    2020-12-15

    生成之后的二维码用开发者工具解析失败,该怎么办?


    2020-12-15
    赞同
    回复
  • 郑旭东
    郑旭东
    2020-11-15

    刚测试成功image.src可以接受直接用base64数据赋值。但是我发现另外一个问题,iOS下canvas尺寸不能太大,不然无法导出图片。

    2020-11-15
    赞同
    回复 1
    • 谋谋谋
      谋谋谋
      2020-11-16
      这个还真没注意
      2020-11-16
      回复
  • 青
    2020-10-22

    工具可以,真机图片不出来,怎么回事啊?

    2020-10-22
    赞同
    回复 3
    • 谋谋谋
      谋谋谋
      2020-10-22
      安全域名配置了么
      2020-10-22
      回复
    • ·
      ·
      2020-11-29回复谋谋谋
      临时文件目录域名不都是http吗,配置不上去啊
      2020-11-29
      回复
    • 1+N.
      1+N.
      2021-04-12
      我也是这个问题,开发工具正常,线上画布上不显示,现在解决了吗?wxfile://usr/xxx.jpg 不显示  wxfile://tmp/xxx.jpg 就能显示,感觉是微信问题
      2021-04-12
      回复
  • 卢霄霄
    卢霄霄
    2020-07-10

    writeFile的时候 可以直接把 encoding选成base64的

    2020-07-10
    赞同
    回复 1
    • 谋谋谋
      谋谋谋
      2020-07-10
      嗯嗯  可以的
      2020-07-10
      回复
  • 大东
    大东
    2020-06-16
    我的没有效果??
    
     util.POSTNOECODE("Wx/GetUnlimited",params,res=>{
          var base64Data = res.data.data;
          /// 通过微信小程序自带方法将base64转为二进制去除特殊符号,再转回base64
            util.base64src(base64Data ).then(res=>{
             console.log("then")
             console.log(res)
            //  context.drawImage(res,0,0,200,200)
             this.setData({
               tempPath:res
             })
             const ctx = wx.createCanvasContext('myCanvas')
             ctx.drawImage(res, 0, 0, 1500, 1000)
           })
          
    
    
    2020-06-16
    赞同
    回复 17
    • 大东
      大东
      2020-06-16
      是服务器返回的图片base64  然后write到文件
      2020-06-16
      回复
    • 谋谋谋
      谋谋谋
      2020-06-16
      什么效果?canvas画不出来?
      2020-06-16
      回复
    • 大东
      大东
      2020-06-19回复谋谋谋
      可以了
      2020-06-19
      回复
    • 殿春
      殿春
      2020-07-15回复谋谋谋
      写入成功后,获取图片报无效怎么办啊
      2020-07-15
      回复
    • 谋谋谋
      谋谋谋
      2020-07-15回复殿春
      异步的问题吧  你加个延时试试
      2020-07-15
      2
      回复
    查看更多(12)
登录 后发表内容