当前位置: 首页 > article >正文

js使用qrcode与canvas生成带logo的二维码

qrcode库

 文档

https://www.npmjs.com/package/qrcode

 安装

npm i qrcode

使用

errorCorrectionLevel: 'H'  // 容错率(H是最高,其它看文档)

width: 200 // 大小

margin: 2 // 边距

import QRCode from 'qrcode'

const testFn = async () => {
    const img= await QRCode.toDataURL('https://www.baidu.com/', { errorCorrectionLevel: 'H', width: 200, margin: 2 })
    console.log(img)
}

canvas绘图

文档

https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API

使用

html

<canvas id="myCanvas" width="100" height="100" style="border: 1px solid #ccc"></canvas>

js

const canvas = document.getElementById('myCanvas')

// 设置画布宽高(也可内联样式写标签上)
canvas.width = 200
canvas.height = 200

// 获取 2d 上下文对象
const ctx = canvas.getContext('2d')

// 绘制圆
// 设置圆的属性
const centerX = canvas.width / 2 // 圆心 X 坐标
const centerY = canvas.height / 2 // 圆心 Y 坐标
const radius = 30 // 圆的半径
ctx.beginPath() // 开始路径
ctx.arc(centerX, centerY, radius, 0, Math.PI * 2, false) // 绘制圆
ctx.fillStyle = '#f9f9f9' // 填充颜色
ctx.fill() // 填充圆
ctx.closePath() // 关闭路径

// 绘制文本
ctx.font = '10px' // 文本大小
ctx.fillStyle = 'blue' // 颜色
ctx.textAlign = 'center' // 水平对齐
ctx.textBaseline = 'middle' // 垂直对齐
ctx.fillText('绘制文本', canvas.width / 2, canvas.height / 2)

 效果

合并图片方法

function mergeImages() {
  const canvas = document.createElement('canvas')
  const ctx = canvas.getContext('2d')

  // 创建两个图片对象
  const img1 = new Image()
  const img2 = new Image()
  img1.src = 'https://www.test.com/menu.png'
  img2.src = 'https://www.test.com//logo.png'

  // 等待两张图片加载完成
  let imagesLoaded = 0

  img1.onload = img2.onload = function () {
    imagesLoaded++
    if (imagesLoaded === 2) {
      // 当两张图片都加载完成后,绘制到 Canvas 上
      ctx.drawImage(img1, 0, 0) // 绘制第一张图片
      ctx.drawImage(img2, 50, 0) // 绘制第二张图片,x偏移 50 像素

      // 下载合并后的图片
      const link = document.createElement('a')
      link.download = 'merged-image.png'
      link.href = canvas.toDataURL('image/png')
      link.click()
    }
  }
}

结合使用实现二维码带logo

使用qrcode生成二维码,使用canvas绘制合并到一起

实现

html

<canvas id="myCanvas" width="100" height="100" style="border: 1px solid #ccc"></canvas>

js 

const onMounted = async () => {
  // await nextTick() // 使用vue加上
  const canvas = document.getElementById('myCanvas')
  canvas.width = 200
  canvas.height = 200
  const ctx = canvas.getContext('2d')
  
  // 生成二维码并绘制到canvas
  const img1 = new Image()
  img1.src = await QRCode.toDataURL('https://www.baidu.com/', { errorCorrectionLevel: 'H', width: 200, margin: 2 })
  await new Promise((resolve, reject) => {
    img1.onload = () => {
      resolve(ctx.drawImage(img1, 0, 0))
    }
  })

  // 绘制圆
  // 设置圆的属性
  const centerX = canvas.width / 2 // 圆心 X 坐标
  const centerY = canvas.height / 2 // 圆心 Y 坐标
  const radius = 30 // 圆的半径
  ctx.beginPath() // 开始路径
  ctx.arc(centerX, centerY, radius, 0, Math.PI * 2, false) // 绘制圆
  ctx.fillStyle = '#f9f9f9' // 填充颜色
  ctx.fill() // 填充圆
  ctx.closePath() // 关闭路径

  // 绘制文本
  ctx.font = '10px'
  ctx.fillStyle = 'blue'
  ctx.textAlign = 'center'
  ctx.textBaseline = 'middle'
  ctx.fillText('绘制文本', canvas.width / 2, canvas.height / 2)
}

 效果

 如需把文本替换成图片,参考上面 合并图片方法 即可


http://www.kler.cn/a/505789.html

相关文章:

  • Freeswitch使用media_bug能力实现回铃音检测
  • Go语言的数据竞争 (Data Race) 和 竞态条件 (Race Condition)
  • Flink 应用
  • Windows 环境下安装和启动 Redis 服务
  • candb++ windows11运行报错,找不到mfc140.dll
  • Java安全—SPEL表达式XXESSTI模板注入JDBCMyBatis注入
  • lua下标是可以从0开始
  • Oracle+11g+笔记(9)-控制文件及日志文件的管理
  • 使用 Python 编写一个简单的聊天机器人
  • 手撕Transformer -- Day7 -- Decoder
  • 【大模型系列篇】数字人音唇同步模型——腾讯开源MuseTalk
  • nolo sonic 2使用串流方式运行steamVR时报错301(VRApplicationError_IPCFailed)
  • idea分支合并代码
  • Go-Zero整合Goose实现MySQL数据库版本管理
  • WinRAR 与解压专家手机版:功能与速度的较量
  • AIDD-人工智能药物设计-快速生成晶体结构,雷丁大学采用GPT架构生成CIF文件
  • Apache Hop从入门到精通 第二课 Apache Hop 核心概念/术语
  • 【前端动效】HTML + CSS 实现打字机效果
  • 「港科技」联手「地平线」打造GPT风格的自动驾驶世界模型:DrivingWorld
  • 相机SD卡照片数据不小心全部删除了怎么办?有什么方法恢复吗?
  • python和装饰器相关的问答题
  • 【Vue中的scoped和 elememt-plus的样式修改】
  • Nginx 可观测性最佳实践
  • MySQL之DDL语言
  • 新版 MacOS 无法从 /usr/local/lib 加载动态链接库的解决办法
  • 算法每日双题精讲 —— 二分查找(二分查找,在排序数组中查找元素的第一个和最后一个位置)