QrCode.js 技术文档:二维码生成与导出工具类

news2025/1/19 9:23:32

概述

QrCode.js 是一个用于生成和导出二维码的 JavaScript 工具类,支持多种样式的二维码生成与导出功能。它依赖于以下主要外部库:

  • qrcode:用于生成基础二维码图像。
  • html-to-image:将 HTML 元素转换为图片。
  • jszip:用于创建压缩包。
  • file-saver:用于触发文件下载。

本文档详细说明了 QrCode.js 提供的主要功能和使用方法。

import { toCanvas as toQrCodeCanvas } from 'qrcode'
import { toCanvas } from 'html-to-image'
import JSZip from 'jszip'
import FileSaver from 'file-saver'

export class QrCode {
  // 二维码样式
  // 导出二维码压缩文件类型
  static picTypeName = ['简洁二维码', '详情二维码', '专业二维码']

  // 创建一个二维码简洁实例
  static createSimpleQrCodeCanvas(text, options) {
    return toQrCodeCanvas(text, { errorCorrectionLevel: 'H', width: 240, height: 240, margin: 2, ...options })
  }

  // 创建一个自定义二维码实例
  static async createdCustomQrCodeCanvas(text, selfEl, backgroundColor = '#28313f') {
    const pixelRatio = window.devicePixelRatio || 1
    const qr = await QrCode.createSimpleQrCodeCanvas(text)
    let createQrDiv = document.createElement('div')
    const containerWidth = Math.max(selfEl.clientWidth + 20, 260)
    createQrDiv.style.width = containerWidth + 'px'
    createQrDiv.style.padding = '260px 10px 10px'
    createQrDiv.style.textAlign = 'center'
    createQrDiv.appendChild(selfEl.cloneNode(true))
    document.body.appendChild(createQrDiv)
    const canvas = await toCanvas(createQrDiv, { backgroundColor, skipFonts: true, pixelRatio })
    const ctx = canvas.getContext('2d')
    ctx.drawImage(qr, ((containerWidth - 240) / 2) * pixelRatio, 10 * pixelRatio, 240 * pixelRatio, 240 * pixelRatio)
    createQrDiv.remove()
    return canvas
  }

  /**
   * 压缩包压缩文件导出
   * @param {*} pics {file: 压缩的文件图片,folder:"所属文件夹", fileName:'文件名称'}
   * @param {*} zipName
   */
  static downloadZip(pics, zipName = window.$t('compressedPackage')) {
    const zip = new JSZip()
    for (let index = 0; index < pics.length; index++) {
      const pic = pics[index]
      zip.file(`${pic.folder ? pic.folder + '/' : ''}${pic.fileName}.png`, pic.file) // 文件夹下文件的名字
    }
    zip.generateAsync({ type: 'blob' }).then(content => {
      FileSaver.saveAs(content, `${zipName}.zip`)
    })
  }

  // 生成图片Blob
  static async canvasToBlob(canvas) {
    return new Promise(resolve => {
      canvas.toBlob(resolve)
    })
  }

  // 导出图片
  static downloadImage(base64Url, fileName) {
    let imgUrl = base64Url
    if (window.navigator.msSaveOrOpenBlob) {
      // 兼容IE浏览器的写法
      let imageStr = atob(imgUrl.split(',')[1])
      let n = imageStr.length
      let u8arr = new Uint8Array(n)
      while (n--) {
        u8arr[n] = imageStr.charCodeAt(n)
      }
      let blob = new Blob([u8arr])
      window.navigator.msSaveOrOpenBlob(blob, `${fileName}.png`)
    } else {
      // 非IE浏览器
      let a = document.createElement('a')
      a.href = imgUrl
      a.setAttribute('download', fileName)
      a.click()
    }
  }

  static blobDownloadImage(blob, fileName = 'chart-download.png') {
    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
      window.navigator.msSaveOrOpenBlob(blob, fileName)
    } else {
      const url = URL.createObjectURL(blob)
      const link = document.createElement('a')
      link.href = url
      link.download = fileName
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
      URL.revokeObjectURL(url)
    }
  }
}

类与方法

静态属性

  • picTypeName
    • 描述:二维码样式的名称列表。
    • 默认值:[window.$t('conciseQRCode'), window.$t('detailsQRCode'), window.$t('professionalQRCode')]
    • 用途:表示不同风格的二维码类型。

静态方法

1. createSimpleQrCodeCanvas(text, options)
  • 描述:创建一个简洁的二维码实例。
  • 参数
    • text (string):需要编码的文本内容。
    • options (object):二维码配置选项(可选)。
      • 默认选项:{ errorCorrectionLevel: 'H', width: 240, height: 240, margin: 2 }
  • 返回值Promise<HTMLCanvasElement>,包含二维码的 Canvas 实例。
  • 示例
    const canvas = await QrCode.createSimpleQrCodeCanvas('Hello World!');
    document.body.appendChild(canvas);
    
2. createdCustomQrCodeCanvas(text, selfEl, backgroundColor = '#28313f')
  • 描述:创建一个自定义样式的二维码。
  • 参数
    • text (string):需要编码的文本内容。
    • selfEl (HTMLElement):需要嵌入的自定义 DOM 元素。
    • backgroundColor (string):背景颜色,默认为 #28313f
  • 返回值Promise<HTMLCanvasElement>,包含自定义二维码的 Canvas 实例。
  • 示例
    const customCanvas = await QrCode.createdCustomQrCodeCanvas('Hello World!', document.getElementById('customElement'));
    document.body.appendChild(customCanvas);
    
3. downloadZip(pics, zipName)
  • 描述:将图片文件打包成 ZIP 并下载。
  • 参数
    • pics (Array):图片文件数组。
      • 每个图片对象包含以下属性:
        • file (Blob):图片文件内容。
        • folder (string):图片所属文件夹名称(可选)。
        • fileName (string):图片文件名称。
    • zipName (string):ZIP 文件名称,默认为 window.$t('compressedPackage')
  • 示例
    QrCode.downloadZip([
      { file: imageBlob1, folder: 'folder1', fileName: 'image1' },
      { file: imageBlob2, fileName: 'image2' }
    ], 'MyQRCodeImages');
    
4. canvasToBlob(canvas)
  • 描述:将 Canvas 转换为 Blob 对象。
  • 参数
    • canvas (HTMLCanvasElement):需要转换的 Canvas 元素。
  • 返回值Promise<Blob>
  • 示例
    const blob = await QrCode.canvasToBlob(myCanvas);
    
5. downloadImage(base64Url, fileName)
  • 描述:导出图片(支持 IE 浏览器)。
  • 参数
    • base64Url (string):图片的 Base64 编码地址。
    • fileName (string):下载的文件名。
  • 示例
    QrCode.downloadImage(base64String, 'myImage');
    
6. blobDownloadImage(blob, fileName)
  • 描述:通过 Blob 对象下载图片。
  • 参数
    • blob (Blob):图片的 Blob 对象。
    • fileName (string):下载的文件名,默认为 chart-download.png
  • 示例
    QrCode.blobDownloadImage(myBlob, 'downloadedImage.png');
    

依赖安装

在使用 QrCode.js 前,请确保已安装以下依赖:

npm install qrcode html-to-image jszip file-saver

使用示例

示例 1:生成简洁二维码

import { QrCode } from './QrCode';

(async () => {
  const canvas = await QrCode.createSimpleQrCodeCanvas('Hello World!');
  document.body.appendChild(canvas);
})();

示例 2:生成自定义二维码并导出

import { QrCode } from './QrCode';

(async () => {
  const customCanvas = await QrCode.createdCustomQrCodeCanvas(
    'Custom QR Code',
    document.getElementById('customElement')
  );
  document.body.appendChild(customCanvas);

  const blob = await QrCode.canvasToBlob(customCanvas);
  QrCode.blobDownloadImage(blob, 'customQRCode.png');
})();

示例 3:批量导出二维码为 ZIP 文件

import { QrCode } from './QrCode';

(async () => {
  const canvas1 = await QrCode.createSimpleQrCodeCanvas('QR1');
  const canvas2 = await QrCode.createSimpleQrCodeCanvas('QR2');

  const blob1 = await QrCode.canvasToBlob(canvas1);
  const blob2 = await QrCode.canvasToBlob(canvas2);

  QrCode.downloadZip([
    { file: blob1, fileName: 'QR1' },
    { file: blob2, fileName: 'QR2' }
  ], 'QRCodeCollection');
})();

注意事项

  1. 在生成自定义二维码时,请确保 selfEl 是一个有效的 HTML 元素。
  2. 下载图片时,确保浏览器支持 Blob 或 Base64 方式。
  3. 使用压缩功能时,建议为每个图片提供唯一的文件名以避免冲突。

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

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

相关文章

美最高法维持TikTok禁令,不卖就禁或有转机,TikTok直播专线助力企业在挑战中前行

一、TikTok 面临的危机与转机 最近&#xff0c;TikTok 在美国的命运可谓是波谲云诡。当地时间 1 月 17 日&#xff0c;美国联邦最高法院裁定 TikTok “不卖就禁” 的法律不违宪&#xff0c;这就意味着该法案将于 1 月 19 日生效 &#xff0c;TikTok 似乎已被逼至悬崖边缘。然而…

编写Wireshark的Lua脚本详解及示例解析

编写Wireshark的Lua脚本详解及示例解析 编写Wireshark Lua脚本的基本步骤SMGP.lua脚本解析脚本解析要点总结Wireshark是一个强大的网络协议分析工具,支持通过Lua脚本扩展其功能,以解析自定义或复杂的协议。下面将详细介绍如何编写Wireshark的Lua脚本,并通过解析一个具体的SM…

【20】Word:小许-质量管理-论文❗

目录 题目​ NO1.2.3.4.5 NO6.7 NO8 NO9 NO10.11 题目 NO1.2.3.4.5 另存为“Word.docx”文件在考生文件夹下&#xff0c;F12Fn是另存为的作用布局→页面设置对话框→纸张&#xff1a;大小A4→页边距&#xff1a;上下左右不连续ctrl选择除表格外的所有内容→开始→字体对…

【软件开发过程管理规范】需求管理,需求分析,设计开发管理,测试管理(Word)

一、需求管理规程 1 简介 2 过程总体描述 2.1 过程概述 2.2 过程流程图 3 过程元素描述 3.1 准备阶段 3.2 需求调研 3.3 需求分析 软件开发人员及用户往往容易忽略信息沟通&#xff0c;这导致软件开发出来后不能很好地满足用户的需要&#xff0c;从而造成返工。而返工不仅在技术…

RabbitMQ-消息可靠性以及延迟消息

目录 消息丢失 一、发送者的可靠性 1.1 生产者重试机制 1.2 生产者确认机制 1.3 实现生产者确认 &#xff08;1&#xff09;开启生产者确认 &#xff08;2&#xff09;定义ReturnCallback &#xff08;3&#xff09;定义ConfirmCallback 二、MQ的持久化 2.1 数据持久…

了解 .mgJSON 文件

.mgJSON &#xff08;Motion Graphics JSON&#xff09;是一个基于标准 JSON 格式的文件扩展名&#xff0c;专门用于存储和交换与动态图形、动画和多媒体应用相关的数据。该格式支持静态和动态数据流&#xff0c;能够精确描述动画、物体变换、图形效果等。 .mgJSON 文件通过层级…

小白爬虫——selenium入门超详细教程

目录 一、selenium简介 二、环境安装 2.1、安装Selenium 2.2、浏览器驱动安装 三、基本操作 3.1、对页面进行操作 3.1.1、初始化webdriver 3.1.2、打开网页 3.1.3、页面操作 3.1.4、页面数据提取 3.1.5、关闭页面 ?3.1.6、综合小案例 3.2、对页面元素进行操作 3…

pycharm+pyside6+desinger实现查询汉字笔顺GIF动图

一、引言 这学期儿子语文期末考试有一道这样的题目&#xff1a; 这道题答案是B&#xff0c;儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的&#xff0c;因为二者有一个笔画是不一样的&#xff0c;“车字旁”下边那笔是“提”&#xff0c;而“车”字是“横”&am…

快手极速版如何查找ip归属地?怎么关掉

在数字化时代&#xff0c;个人隐私的保护成为了广大用户关注的焦点。快手极速版作为一款备受欢迎的短视频应用&#xff0c;其IP归属地的显示与关闭功能自然也成了用户热议的话题。本文将详细介绍如何在快手极速版中查找IP归属地以及如何关闭IP属地显示&#xff0c;帮助用户更好…

C++ 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

Go语言strings包与字符串操作:从基础到高级的全面解析

Go语言strings包与字符串操作:从基础到高级的全面解析 引言 Go语言以其简洁、高效和强大的标准库而闻名,其中strings包是处理字符串操作的核心工具。本文将深入探讨Go语言中strings包的功能及其在实际开发中的应用,帮助开发者更好地理解和使用这一工具。 1. strings包概述…

基于YOLOv4与Tkinter的口罩识别系统

往期精彩 基于YOLOv11的番茄成熟度实时检测系统设计与实现 用YOLOv11检测美国手语&#xff1a;挥动手腕的科技魔法 基于YOLOv11模型PyQt的实时鸡行为检测系统研究 OpenCV与YOLO在人脸识别中的应用研究(论文源码) 计算机视觉&#xff1a;农作物病虫害检测系统&#xff1a;基于Y…

电力场景红外测温图像绝缘套管分割数据集labelme格式2436张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;2436 标注数量(json文件个数)&#xff1a;2436 标注类别数&#xff1a;1 标注类别名称:["arrester"] 每个类别标注的框数&am…

AI编程工具使用技巧——通义灵码

活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…

电梯系统的UML文档05

Dispatcher 不控制实际的电梯组件&#xff0c;但它在软件系统中是重要的。每一个电梯有一个ispatcher&#xff0c;主要功能是计算电梯的移动方向、移动目的地以及保持门的打开时间。它和系统中除灯控制器以外的几乎所有控制对象交互。 安全装置也是一个环境对象&#xff0c;它…

各种获取数据接口

各种获取数据免费接口 1.音频接口 代理配置 /music-api:{target:https://api.cenguigui.cn/,changeOrigin:true,rewrite:(path)>path.replace(/^\/music-api/,),secure:false}axios全局配置 import axios from axios;const MusicClient axios.create({baseURL: /music-a…

外包公司名单一览表(成都)

大家好&#xff0c;我是苍何。 之前写了一篇武汉的外包公司名单&#xff0c;评论区做了个简单统计&#xff0c;很多人说&#xff0c;在外包的日子很煎熬&#xff0c;不再想去了。 有小伙伴留言说有些外包会强制离职&#xff0c;不行就转岗&#xff0c;让人极度没有安全感。 这…

第十一章 图论

#include <iostream> #include <cstdio> #include <vector>using namespace std;const int MAXN 1000;vector<int> graph[MAXN]; //用向量存储邻接表中的每个点及其连接的的其他点int main(){return 0; } #include <iostream> #include &…

大数据中 TopK 问题的常用套路

大数据中 TopK 问题的常用套路 作者 Chunel Feng&#xff0c;编程爱好者&#xff0c;阿里巴巴搜索引擎开发工程师。开源项目&#xff1a;Caiss 智能相似搜索引擎 对于海量数据到处理经常会涉及到 topK 问题。在设计数据结构和算法的时候&#xff0c;主要需要考虑的应该是当前算…

RabbitMQ基础篇

文章目录 1 RabbitMQ概述1.1 消息队列1.2 RabbitMQ体系结构 2 RabbitMQ工作模式2.1 简单模式&#xff08;Simple Queue&#xff09;2.2 工作队列模式&#xff08;Work Queues&#xff09;2.3 发布/订阅模式&#xff08;Publish/Subscribe&#xff09;2.4 路由模式&#xff08;R…