文章目录

    • 概要
    • QR码
    • 步骤
      • 1. 引入库
      • 2. 生成二维码
      • 3. 将二维码加入页面中
    • 用javascript库简化二维码生成
      • 1. 引入库
      • 2. 使用库生成二维码
    • 二维码美化和定制
      • 1. 调整大小
      • 2. 调整颜色
      • 3. 添加自定义形状和图案
      • 4. 添加logo
    • 性能优化与错误处理
      • 1. 减少不必要的计算
      • 2. 异步处理

概要

生成 URL 二维码的基本原理是将 URL 字符串转换成二维码的编码格式,然后通过特定的算法生成二维码图像。这个过程通常涉及以下几个步骤:

  1. 对 URL 进行编码。
  2. 选择合适的二维码版本和纠错等级。
  3. 生成二维码矩阵。
  4. 根据矩阵生成图像。

使用 JavaScript 生成 URL 二维码,可以在客户端直接完成,无需服务器端支持,这样可以减少服务器的负担,提高用户体验。此外,JavaScript 库提供了简单易用的 API,使得二维码的生成变得非常便捷。

QR码

QR 码(Quick Response Code)是最流行的二维码类型之一,由日本 Denso Wave 公司于 1994 年发明。它的设计初衷是为了能够在短时间内被读取,并且能够容纳更多的信息。QR 码可以存储数字、字母、文字以及二进制数据。

一个二维码由以下几个基本部分构成:

  • 静止区:围绕二维码的白色边框,用于隔离二维码和背景。
  • 定位图形:位于二维码的三个角落,帮助扫描器快速定位二维码。
  • 数据区:包含编码信息的部分。
  • 格式信息:包含有关二维码版本和纠错等级的信息。

二维码具有纠错功能,这意味着即使部分二维码损坏或被遮挡,扫描器仍然能够正确读取信息。纠错等级分为四个级别,从低到高分别是 L、M、Q 和 H,分别对应约 7%、15%、25% 和 30% 的纠错能力。

步骤

1. 引入库

npm install qrcode
import { toCanvas } from 'qrcode';   //按需引入

2. 生成二维码

const generateQRCode = async (url) => {const canvas = document.createElement('canvas');await toCanvas(canvas, url, {width: 256,margin: 4,errorCorrectionLevel: 'L'});return canvas;
}

3. 将二维码加入页面中

const displayQRCode = async (url) => {const canvas = await generateQRCode(url);const container = document.querySelector('.agent-card-' + props.value.id + ' .canvas-container');if (container) {container.innerHTML = '';container.appendChild(canvas);}
}

用javascript库简化二维码生成

目前流行的二维码生成库包括 qrcode.js、qrcode-generator 等。这些库通常提供了丰富的配置选项和良好的兼容性,使得开发者能够快速集成二维码生成功能。

1. 引入库

import QRCode from 'qrcode';

2. 使用库生成二维码

<canvas id="qrcode-canvas"></canvas>
//生成二维码
QRCode.toDataURL(fullUrl, (err, url) => {if (err) {console.error(err);return;}});
//二维码嵌入网页
QRCode.toCanvas(document.getElementById('qrcode-canvas'), fullUrl, function (error) {if (error) {console.error(error);return;}visible.value = true;});

二维码美化和定制

1. 调整大小

// 设置二维码的尺寸
const qr = qrcode(0, 'L');
qr.size = 300; // 设置为300x300像素
qr.makeCode(url);

2. 调整颜色

// 设置二维码的前景色和背景色
const qr = qrcode(0, 'L');
qr.size = 300;
qr.foreground = '#0000FF'; // 蓝色前景
qr.background = '#FFFFFF'; // 白色背景
qr.makeCode(url);

3. 添加自定义形状和图案

// 在二维码中添加自定义形状
function addCustomShape(qr) {const size = qr.size;const moduleSize = qr.moduleSize;const ctx = qr._oContext;// 添加自定义形状的代码// 例如,在二维码中心添加一个小的圆形图案ctx.beginPath();ctx.arc(size / 2, size / 2, moduleSize * 3, 0, 2 * Math.PI);ctx.fillStyle = '#FF0000'; // 红色ctx.fill();
}// 生成二维码
const qr = qrcode(0, 'L');
qr.size = 300;
qr.makeCode(url);// 添加自定义形状
addCustomShape(qr);

4. 添加logo

这通常需要在二维码的静态区域添加一个透明的品牌图像。

// 在二维码中添加品牌Logo
function addBrandLogo(qr, logoUrl) {const size = qr.size;const logo = new Image();logo.src = logoUrl;logo.onload = function() {const logoSize = size / 5; // 假设Logo大小为二维码大小的1/5const ctx = qr._oContext;ctx.drawImage(logo, (size - logoSize) / 2, (size - logoSize) / 2, logoSize, logoSize);};
}// 生成二维码
const qr = qrcode(0, 'L');
qr.size = 300;
qr.makeCode(url);// 添加品牌Logo
addBrandLogo(qr, 'path/to/logo.png');

性能优化与错误处理

在实现 URL 二维码生成的过程中,性能优化和错误处理是确保用户体验和功能稳定性的关键环节。合理的性能优化可以提升生成二维码的速度,而有效的错误处理则能够保证在出现问题时用户能够获得清晰的反馈。

1. 减少不必要的计算

在生成二维码之前,可以先对 URL 进行验证,确保其格式正确,避免无效的生成尝试。此外,缓存一些可重用的计算结果,如纠错码的计算,也可以减少重复的计算工作。

2. 异步处理

// 使用Promise异步生成二维码
function generateQRCodeAsync(url) {return new Promise((resolve, reject) => {try {const qr = qrcode(0, 'L');qr.size = 300;qr.makeCode(url);resolve(qr);} catch (error) {reject(error);}});
}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF+MVVM入门学习

最近在学WPF的MVVM&#xff0c;有两种方式实现&#xff0c;一种是自己实现&#xff0c;一种是借助MVVM框架&#xff0c;接下来通过一个医院自助打印报告机键盘输入界面来演示自己实现、框架CommunityToolkit和Prism的区别。 项目源码&#xff1a;https://gitee.com/cplmlm/Sel…

[e3nn] docs | 不可约表示(Irreps)

链接&#xff1a;https://docs.e3nn.org/en/latest/examples/examples.html docs&#xff1a;e3nn e3nn是一个用于构建欧几里得(E(3))等变神经网络的Python库&#xff0c;这意味着它们能自动保持三维旋转和反射的对称性。 该库使用不可约表示(Irreps)来描述数据变换方式&…

深入浅出 ArrayList:从基础用法到底层原理的全面解析(中)

四、ArrayList 常用方法实战 —— 从添加到遍历的全场景覆盖ArrayList 提供了数十个方法&#xff0c;但日常开发中常用的只有 10 个左右&#xff0c;我们按 “元素操作”“集合查询”“遍历方式” 三类来梳理&#xff0c;每个方法都附带示例和注意事项。4.1 元素添加&#xff1…

java后端如何实现下载功能

后端需要把要下载的若干文件 按 ZIP 格式编码成一段二进制字节流&#xff0c;然后以 Content-Type: application/zip Content-Disposition: attachment; filenamexxx.zip 的形式写进 HTTP 响应体。浏览器收到这段“ZIP 格式的字节流”后&#xff0c;就会弹出保存对话框&#xf…

AI生成技术报告:GaussDB与openGauss的HTAP功能全面对比

GaussDB 与 openGauss 的 HTAP 功能比较 前言 GaussDB集中式版本从505.2版本开始引入了HTAP混合负载功能&#xff0c;openGauss也从7.0.0 RC1版本开始引入了HTAP行列融合功能&#xff0c;加强了行存转列存的使用友好度&#xff0c;但两者的实现似乎存在不小的差异。 虽然文档…

小程序开发指南(四)(UI 框架整合)

✍讲解了微信小程序 UI 框架的使用方法和特点&#xff0c;根据项目需求选择合适的组件库。附有相应的组件库预览码&#xff0c;也是将所有的微信小程序原生组件库整合在一起方便后续开发的使用。如果有不好或者有错误的地方请告知&#xff01;希望可以与大家相互的交流学习&…

golang 1.25.0 安装

wget https://golang.google.cn/dl/go1.25.0.linux-amd64.tar.gz tar -C /usr/local/ -xzf go1.25.0.linux-amd64.tar.gz ln -s /usr/local/go/bin/* /usr/bin/ go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct

基于深度学习的人脸表情识别系统:YOLOv5/v6/v7/v8/v10模型实现与UI界面集成

基于YOLOv5/v7/v8的智能人脸表情识别系统:从算法原理到应用实现 表情识别的技术价值与挑战 人脸表情识别(Facial Expression Recognition, FERYOLOv5/v7/v8等深度学习算法构建高效的表情识别系统,并设计直观的UI界面集成方案。无论你是深度学习初学者还是有经验的开发者,…

初步了解多线程

系列文章目录 目录 系列文章目录 前言 一、进程 二、线程 1. 线程解决资源开销的方式 2. 线程和进程的联系和区别 三、多线程编程 1. 直观了解多线程 2. 线程的创建方式 1. 继承 Thread 重写 run() 方法 2. 实现 Runable 接口&#xff0c;重写 run() 方法 3. 继承 …

安卓Android低功耗蓝牙BLE连接异常报错133

安卓Android低功耗蓝牙BLE连接异常报错133 之前连接一直好好的,不知道为什么今天突然就连接不了蓝牙了,报错133,按照 找网上的说明总是说清除GATT缓存,其实并不是我的问题,最后看到这里https://softs.im/android-ble-%e8%bf%9e%e6%8e%a5%e9%94%99%e8%af%af133/ 有如下说明: 情…

【分治】快排与归并专题

分治思想 分&#xff08;Divide&#xff09;&#xff1a;将待排序数组不断拆分为两个等长&#xff08;或近似等长&#xff09;的子数组&#xff0c;直到子数组长度为 1&#xff08;天然有序&#xff09;。 治&#xff08;Conquer&#xff09;&#xff1a;递归排序每个子数组。 …

[Linux]学习笔记系列 -- mm/page_alloc

文章目录mm/page_alloc.c 伙伴系统内存分配器(Buddy System Memory Allocator) 内核物理内存管理的核心历史与背景这项技术是为了解决什么特定问题而诞生的&#xff1f;它的发展经历了哪些重要的里程碑或版本迭代&#xff1f;目前该技术的社区活跃度和主流应用情况如何&#xf…

3秒传输大文件:cpolar+Localsend实现跨网络秒传

文章目录前言1. 在Windows上安装LocalSend2. 安装Cpolar内网穿透3. 公网访问LocalSend4. 固定LocalSend公网地址用 cpolar 让 Localsend 突破距离限制就是这么简单&#xff01;三步轻松搞定&#xff1a;在手机和电脑上都安装 Localsend&#xff0c;在其中一台设备上运行 cpolar…

基于STM32单片机智能RFID刷卡汽车位锁桩设计

1 系统功能介绍 本系统是一个 基于 STM32 单片机的智能 RFID 刷卡车位锁桩控制系统&#xff0c;其设计理念来源于现实中智能停车场的车位锁桩管理。通过 RFID 刷卡认证、LCD1602 显示、继电器控制以及按键辅助操作&#xff0c;实现对车位的安全管理。该系统不仅模拟了车辆驶入与…

SQL185 试卷完成数同比2020年的增长率及排名变化

描述现有试卷信息表examination_info&#xff08;exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间&#xff09;&#xff1a;试卷作答记录表exam_record&#xff08;uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交…

网络编程中的TCP——TCP的连接的建立、关闭、状态转移

网络编程中的TCP——TCP的连接的建立、关闭、状态转移 TCP连接的建立和关闭wireshark捕获数据&#xff1a;TCP三次握手四次挥手的时序图&#xff1a;三次握手&#xff1a; 报文段1包含SYN标志&#xff0c;这是一个同步报文段&#xff0c;表示发起连接请求&#xff0c;包含自己起…

SQL 语句拼接在 C 语言中的实现与安全性分析

代码解析 // 构建SQL插入语句 char *sql_insert (char *)malloc(sizeof(char) * 200); // 分配200字节内存 strcpy(sql_insert, "INSERT INTO user(username, passwd) VALUES("); // 复制基础SQL语句 strcat(sql_insert, ""); // 添加单引号 strcat(sq…

`lock()` 和 `unlock()` 线程同步函数

1) 函数的概念与用途 lock() 和 unlock() 不是特定的标准库函数&#xff0c;而是线程同步原语的一般概念&#xff0c;用于在多线程环境中保护共享资源。在不同的编程环境和库中&#xff0c;这些函数有不同的具体实现&#xff08;如 POSIX 线程的 pthread_mutex_lock() 或 C 的 …

升级openssh后ORACLE RAC EM 安装失败处理

升级过程中由于SCP传输时目标目录/tmp/tempRACTrans_2025_08_22--18-25-44-032/ractrans 不存在导致的OC4J配置失败&#xff1a;WARNING: /usr/bin/scp: dest open "/tmp/tempRACTrans_2025_08_22--18-25-44-032/ractrans": No such file or directory/usr/bin/scp…

ADB 调试工具的学习[特殊字符]

一、ADB 的工作原理 1.1 ADB 概念 ADB (Android Debug Bridge)&#xff1a;Android 调试桥&#xff0c;是开发/测试 Android 应用必备的调试工具。作用&#xff1a;通过 电脑终端命令 操作 安卓手机/模拟器。 1.2 ADB 构成与原理 ADB 由三部分组成&#xff1a; Client 端&#…