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

news2024/11/25 6:49:07

**需求实现步骤如下

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

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

<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

npm install weapp-qrcode-canvas-2d --save

weapp-qrcode-canvas-2d github
inviteBg是返回的微信临时图片地址

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

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)
      }
    })
  })

}

保存图片

在这里插入图片描述
点击保存图片,至此就能把这个图片保存到手机里啦

    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);
          })

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2223625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis Search系列 - 第一讲 创建索引

目录 一、引言二、全文检索基本概念三、创建索引 一、引言 Redis Search 是 Redis 的一个模块&#xff0c;用于提供全文搜索和二级索引功能。它允许在 Redis 数据库中执行复杂的搜索查询&#xff0c;并支持多种数据类型和查询操作。以下是 Redis Search 的一些关键特性&#x…

初识Linux · 软硬链接

目录 前言&#xff1a; 见见软硬链接 软硬链接的特征 软硬链接的用处 前言&#xff1a; 前文我们介绍了磁盘系统的理解&#xff0c;并且基于磁盘系统对文件系统的整体框架有了一个简单的理解&#xff0c;我们都是通过“想要见识没有打开的文件”这个话题引出来了以上的两个…

探索Python与Excel的无缝对接:xlwings库的神秘面纱

文章目录 探索Python与Excel的无缝对接&#xff1a;xlwings库的神秘面纱1. 背景介绍&#xff1a;为何选择xlwings&#xff1f;2. xlwings是什么&#xff1f;3. 如何安装xlwings&#xff1f;4. 简单的库函数使用方法打开工作簿创建工作簿读取单元格数据写入单元格数据保存并关闭…

400V交流智能剩余电流监测系统设计与应用

摘要&#xff1a;针对变电站400V交流系统频繁发生剩余电流保护器跳闸的问题&#xff0c;本研究设计了一套智能化的分布式剩余电流监测系统。该系统利用CT传感器采集400V系统各负载端的剩余电流数据&#xff0c;经过运算处理后&#xff0c;将信息传递给交流绝缘监测装置。随后&a…

>甘晴void:小蒟蒻的CCSP2024

小蒟蒻前两天参加了CCSP2024 最终幸运蹭铜&#xff08;蹭着本科的边边捞到了铜牌&#xff0c;没有遗憾了&#xff09;。 评价感受 本来只是来打酱油&#xff08;蹭吃蹭喝&#xff09;的&#xff0c;因为自从推免结束后&#xff0c;已经正好一个月没碰代码了&#xff0c;上一次…

DeepLearn-实现天气的识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本次使用的数据集有晴天、雨天、多云和日出。 导入基本的包 包括读取文件、图像处理、科学计算和tensorflow的api包layers是层模块&#xff0c;提供了神经网络…

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist 环境 python 3.10 torch 2.4.0cu118 torchvision 0.19.0cu118 vllm 0.6.1.post2cu118问题详情 if torch._C._d…

利用客户端导入有关联的业务数据(DBeaver+sql)

前言 最近有点坑&#xff0c;麻辣烫的活落手上了&#xff0c;上个迭代除了自己的开发任务&#xff0c;还有处理接手的工作。然后节后问题又多&#xff0c;还有前1个迭代没有测试的模块本迭代测试&#xff0c;烦死了。 这次这个数据处理的活&#xff0c;以后希望可以交出…

香橙派5(RK3588)使用npu加速yolov5推理的部署过程

香橙派5使用npu加速yolov5推理的部署过程 硬件环境 部署过程 模型训练(x86主机) 在带nvidia显卡(最好)的主机上进行yolo的配置与训练, 获取最终的best.pt模型文件, 详见另一篇文档 模型转换(x86主机) 下载airockchip提供的yolov5(从pt到onnx) 一定要下这个版本的yolov5, …

docker集成Nginx和Mysql (教程)

文章目录 前言一、Docker 集成Nginx步骤 1&#xff1a;安装 Docker步骤 2&#xff1a;拉取官方的 Nginx Docker 镜像1.可以先搜索nginx镜像(查看nginx镜像)2.拉取nginx镜像步骤 3&#xff1a;运行 Nginx 容器 二、Docker 集成Mysql步骤 1&#xff1a;拉取mysql镜像步骤2、运行 …

Vulnhub打靶-DC-1

基本信息 靶机下载&#xff1a;https://download.vulnhub.com/dc/DC-1.zip 攻击机器&#xff1a;192.168.20.128&#xff08;Windows操作系统&#xff09;& 192.168.20.138&#xff08;kali&#xff09; 靶机&#xff1a;192.168.20.0/24 目标&#xff1a;获取2个flag…

SQL 干货 | SQL 半连接

大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 ANSI SQL 编写这些连接类型&#xff0c;但还有一些连接类型是基于关系代数运算符的&#xff0c;在 SQL 中没有语法表示。今天我们将学习一种这样的连接类型&#xff1a;半连接&#xff08;Semi …

tensorflow案例3--运动鞋识别(学习tensorflow动态加载学习率、如何设置早停等方法)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 这个案例还是以学习API为主&#xff0c;学习了tensorflow如何动态加载学习率、如何设置早停等方法&#xff1b;这个案例主要学习为主&#xff0c;由于模…

SpringBoot 集成RabbitMQ 实现钉钉日报定时发送功能

文章目录 一、RabbitMq 下载安装二、开发步骤&#xff1a;1.MAVEN 配置2. RabbitMqConfig 配置3. RabbitMqUtil 工具类4. DailyDelaySendConsumer 消费者监听5. 测试延迟发送 一、RabbitMq 下载安装 官网&#xff1a;https://www.rabbitmq.com/docs 二、开发步骤&#xff1a;…

Python 实现彩票抽奖系统详解(双色球)

目录 一、系统功能概述 二、代码实现详解 &#xff08;一&#xff09;自选功能实现&#xff08;ziXuanCaiPiao函数&#xff09; &#xff08;二&#xff09;机选功能实现&#xff08;autoChoiceCaiPiao函数&#xff09; &#xff08;三&#xff09;彩票展示功能实现&#x…

如何解决 IDEA 的 pom.xml 文件中,依赖警告问题

原因 在升级高版本的Idea后&#xff0c;我的是&#xff08;2024.2&#xff09;版本。Idea默认引入了插件 Package Checker 插件&#xff0c;用于检查 Maven 的 pom.xml 引入的 jar 包是否有漏洞风险。如果有漏洞风险则直接在引入的 pom.xml 下画黄线警告。 虽然不是错误&…

Tkinter -- python GUI学习与使用

前言 python GUI 目前pythonGUI有很多&#xff0c;哪一个最好&#xff1f; 先说说我选择的思路&#xff0c;我的目的是开发一个易用的软件&#xff0c;最重要的是稳定&#xff0c;并且碰到问题能够解决&#xff0c;因此&#xff0c;我的目标很明确&#xff0c;有比较大的用户群…

杂项笔记

1 这个好像如果如果分配空间就会执行 这个扩容好像会进行拷贝 2 3 4 没懂 5

【数据结构与算法】走进数据结构的“时间胶囊”——栈

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 引言 一.栈的基本概念 1.1 定义 1.2 特性 1.3 基本操作 二.栈的实现方式 2.1 顺序栈 2.2 链栈 三.顺序栈的实现 定义顺序栈的结构 初始化 入栈 检查栈是否为空 出栈 销毁 四.链栈的实现 定义链栈的结构 初始…

未来汽车驾驶还会有趣吗?车辆动力学系统简史

未来汽车驾驶还会有趣吗&#xff1f;车辆动力学系统简史 本篇文章来源&#xff1a;Schmidt, F., Knig, L. (2020). Will driving still be fun in the future? Vehicle dynamics systems through the ages. In: Pfeffer, P. (eds) 10th International Munich Chassis Symposiu…