微信小程序canvas 生成二维码图片,画图片,生成图片,将两个canvas结合并保存图片

需求实现步骤如下

  1. 先定义两个canvas
  2. 一个canvas myQrcode画二维码的图片
  3. 另一个canvas mycanvas画一个背景图,并把二维码画到这个canvas上,mycanvas这个canvas生成一张图片,返回图片的临时路径
  4. 最后保存图片到手机

首先wxml,新版微信小程序canvas要注意写 type="2d" id="XXX"

html 复制代码
<canvas type="2d" style="width: 750rpx;height: 1260rpx;position:fixed;top: 1000px;left: 0px;z-index: 9999999999;" id="mycanvas"></canvas>
<canvas type="2d" style="width: 200rpx;height: 200rpx;position:fixed;top: 1000px;left: 0px;z-index: 9999999999;" id="myQrcode"></canvas>

画图

安装weapp-qrcode-canvas-2d

bash 复制代码
npm install weapp-qrcode-canvas-2d --save

weapp-qrcode-canvas-2d github

inviteBg是返回的微信临时图片地址

javascript 复制代码
import {
  loadImg
} from '../../utils/drawPoster'
Page({
	onLoad(){
    const ewmLink = getApp().api.requestBase + '/index?user_id=' + userInfo.userId;
    const img = 'https://jingdong-sauce.oss-cn-beijing.aliyuncs.com/images/b49632186701d80f507a0b0930a34435.jpg'

    loadImg('#mycanvas', '#myQrcode', ewmLink, img, this, (base64) => {
      console.log(base64)
      this.setData({
        inviteBg: base64,
        saveImgShow: true
      })
    })
	}
})

先通过wx.createSelectorQuery(),查询到两个canvas

然后画二维码图片drawCode,并生成二维码临时图片canvasToTempFilePath

canvas1.createImage() ctx.drawImage(img, 0, 0, canvas1.width / 3, canvas1.height / 3); 将背景图片画到canvas1上

canvas1.createImage() ctx.drawImage(img2, canvas1.width / 6 - 70, 340, 140, 140) 将二维码图片画到canvas1上

wx.canvasToTempFilePath 生成canvas1背景图和二维码图片结合的临时图片并返回

drawPoster.js

javascript 复制代码
import drawQrcode from 'weapp-qrcode-canvas-2d'
// 假设你已经引入了 qrcode.js
export function loadImg(canvasId1, canvasId2, ewmLink, imgUrl, context, callback) {
  const query = wx.createSelectorQuery()
  query.select(canvasId1).fields({
    node: true,
    size: true
  })
  query.select(canvasId2).fields({
    node: true,
    size: true
  })
  query.exec(async (res) => {
    console.log(res)
    const canvas1 = res[0].node
    const canvas2 = res[1].node
    // 调用方法drawQrcode生成二维码
    let img2Src = await drawCode(canvas2, canvasId2, ewmLink)
    console.log('img2Src', img2Src)
    const ctx = canvas1.getContext('2d')
    const dpr = wx.getSystemInfoSync().pixelRatio
    canvas1.width = res[0].width * dpr
    canvas1.height = res[0].height * dpr
    ctx.scale(dpr, dpr)
    const img = canvas1.createImage()
    img.src = imgUrl
    img.onload = () => {
      ctx.drawImage(img, 0, 0, canvas1.width / 3, canvas1.height / 3);
      console.log(ctx)
      const img2 = canvas1.createImage()
      img2.src = img2Src
      img2.onload = () => {
        ctx.drawImage(img2, canvas1.width / 6 - 70, 340, 140, 140)
        wx.canvasToTempFilePath({
          canvasId: canvasId1,
          canvas: canvas1,
          x: 0,
          y: 0,
          width: 414,
          height: 695,
          destWidth: 414,
          destHeight: 695,
          success(res) {
            console.log('合成图片路径', res.tempFilePath)
            callback(res.tempFilePath)
          },
          fail(res) {
            console.error(res)
          }
        })
      }
    }
  })

}

function drawCode(canvas, canvasId, ewmLink) {
  return new Promise(async (resolve, reject) => {
    await drawQrcode({
      canvas: canvas,
      canvasId: canvasId,
      width: 200,
      padding: 30,
      background: '#ffffff',
      foreground: '#000000',
      text: ewmLink,
    })
    wx.canvasToTempFilePath({
      canvasId: canvasId,
      canvas: canvas,
      x: 0,
      y: 0,
      width: 260,
      height: 260,
      destWidth: 260,
      destHeight: 260,
      success(res) {
        resolve(res.tempFilePath)
        console.log('二维码临时路径:', res.tempFilePath)
      },
      fail(res) {
        console.error(res)
      }
    })
  })

}

保存图片

点击保存图片,至此就能把这个图片保存到手机里啦

javascript 复制代码
    const query = wx.createSelectorQuery()
          query.select('#mycanvas').fields({
            node: true,
            size: true
          }).exec(res => {
            wx.canvasToTempFilePath({
              canvas: res[0].node,
              success: function (res) {
                console.log("uuuu22222")
                wx.saveImageToPhotosAlbum({
                  filePath: res.tempFilePath,
                  success: function () {
                    console.log("33333")
                    wx.showToast({
                      title: '保存成功',
                    })

                  }
                })
              },
              fail: function (res) {
                console.log("444444")
                console.log(res);
              }
            }, _this);
          })
相关推荐
DK开源圈子陪玩软件开发5 分钟前
行业圈子小程序 微信社区小程序圈子论坛社区小程序
微信·小程序
Jocelyn_书1 小时前
uniapp编译多端项目App、小程序,input框键盘输入后
小程序·uni-app·项目
尚学教辅学习资料1 小时前
基于微信小程序的公务员考试信息查询系统+LW示例参考
小程序·毕业设计·考试系统·java源码·公务员·信息查询
Jing_jing_X2 小时前
自研小程序-心情追忆
小程序
七夜zippoe2 小时前
微信小程序元素水平居中或垂直居中
微信小程序·小程序
井眼2 小时前
微信小程序-全局数据共享/页面间通信
微信小程序·小程序
程序媛_文乐3 小时前
微信小程序如何实现地图轨迹回放?
微信小程序·小程序
硬汉嵌入式8 小时前
H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)
开发语言·junit·小程序·lua
计算机学姐13 小时前
基于uniapp微信小程序的餐厅预约点餐系统
java·spring boot·微信小程序·小程序·java-ee·uni-app·tomcat
尘浮生13 小时前
Java项目实战II基于Spring Boot的美食烹饪互动平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·微信小程序·小程序·美食