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

server/2025/1/20 21:05:52/

qrcode库

 文档

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

 安装

npm i qrcode

使用

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

width: 200 // 大小

margin: 2 // 边距

javascript">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

javascript">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)

 效果

合并图片方法

javascript">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 = 0img1.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 

javascript">const onMounted = async () => {// await nextTick() // 使用vue加上const canvas = document.getElementById('myCanvas')canvas.width = 200canvas.height = 200const ctx = canvas.getContext('2d')// 生成二维码并绘制到canvasconst 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.ppmy.cn/server/159985.html

相关文章

【Golang 面试题】每日 3 题(三十三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

安装指南:LLaMA Factory、AutoGPTQ 和 vllm

安装指南&#xff1a;LLaMA Factory、AutoGPTQ 和 vllm 在本文中&#xff0c;我们将详细介绍如何安装 LLaMA Factory、AutoGPTQ 和 vllm&#xff0c;这些工具在大型语言模型&#xff08;LLMs&#xff09;和视觉语言模型&#xff08;VLMs&#xff09;的微调和量化中非常有用。我…

JavaScript笔记APIs篇01——DOM获取与属性操作

黑马程序员视频地址&#xff1a;黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p78https://www.bilibili.com/video/BV1Y84y1L7Nn?…

什么是报文的大端和小端,有没有什么记忆口诀?

在计算机科学中&#xff0c;**大端&#xff08;Big-Endian&#xff09;和小端&#xff08;Little-Endian&#xff09;**是两种不同的字节序&#xff08;即多字节数据在内存中的存储顺序&#xff09;。理解这两种字节序对于网络通信、文件格式解析以及跨平台编程等非常重要。 1…

51c自动驾驶~合集47

我自己的原文哦~ https://blog.51cto.com/whaosoft/13083194 #DreamDrive 性能爆拉30%&#xff01;英伟达&#xff1a;时空一致下的生成重建大一统新方案~ 从自车的驾驶轨迹中生成真实的视觉图像是实现自动驾驶模型可扩展训练的关键一步。基于重建的方法从log中生成3D场景…

02、Redis从入门到放弃 之 常用命令和基本数据类型操作

Redis从入门到放弃 之 常用命令和基本数据类型操作 一、Redis通用命令 redis-cli -h 127.0.0.1 -p 6379 redis客户端登录 -h host -p 端口 -a 密码exit 退出当前客户端info 返回redis的一些相关信息&#xff08;包括端口、配置文件等&#xff09;flushdb 清空当前库…

【探寻C++之旅】第二章:类和对象(上)

请君浏览 前言1. 类和对象是什么2. 类的定义2.1 类定义的格式2.2 访问限定符2.3 类域 3. 实例化3.1 实例化概念3.2 对象大小 4. this指针5. C和C语言实现Stack&#xff08;栈&#xff09;的对比尾声 前言 今天&#xff0c;我们继续踏入追寻C的冒险历程。上一章我们简单介绍了C中…

C# OpenCV机器视觉:常用滤波算法

在一个电闪雷鸣的夜晚&#xff0c;阿强的实验室里却灯火通明&#xff0c;宛如黑暗中的科技孤岛。窗外狂风呼啸&#xff0c;大雨倾盆&#xff0c;仿佛是世界末日的序曲&#xff1b;而屋内&#xff0c;阿强正对着电脑屏幕愁眉苦脸&#xff0c;屏幕上是一张张 “惨不忍睹” 的图像…