二维码生成器:从前端到打印的全流程

二维码生成器:从前端到打印的全流程

二维码库的选择

前端生成二维码的库挺多的,我们用的是qrcode这个npm包,star数比较多,维护也比较活跃。

npm install qrcode 

项目里的版本是1.5.4。

基本用法

二维码生成非常简单:

import QRCode from "qrcode"; QRCode.toDataURL("https://example.com").then(url => { console.log(url); // base64格式的图片数据 }); 

在我们的项目里,二维码生成是在支付场景下用的。用户选择充值套餐后,后端返回一个支付链接,前端把这个链接转成二维码显示:

<template> <el-dialog title="支付二维码" :visible.sync="openWeixinCode"> <div>¥ {{ rechargeList[activeRecharge].price }}</div> <el-image :src="orderInfo.url" fit="contain"></el-image> <div>请使用微信扫一扫,扫描二维码完成支付</div> </el-dialog> </template> <script> import QRCode from "qrcode"; export default { methods: { handlePay() { buyRechargePower(this.rechargeList[this.activeRecharge].id).then(res => { QRCode.toDataURL(res.data.url).then(url => { this.orderInfo.url = url; this.openWeixinCode = true; // 轮询支付状态 this.timer = setInterval(() => { this.getEnOrderStatus(); }, 2000); }); }); } } } </script> 

第一个坑:二维码太复杂扫不出来

一开始生成的二维码特别复杂,感觉密密麻麻全是点,手机扫码很难识别。

后来查了一下文档,发现可以通过errorCorrectionLevel参数调整容错率:

QRCode.toDataURL(url, { errorCorrectionLevel: 'L' // L、M、Q、H,容错率从低到高 }).then(url => { // ... }); 

容错率越高,二维码越复杂但越抗污损。对于我们的场景(线上扫码显示在手机屏幕上),选L级别就够了,二维码会简洁很多,扫码速度快很多。

第二个坑:二维码尺寸和清晰度

默认生成的二维码分辨率不太高,在高清屏上有点模糊。可以设置width参数:

QRCode.toDataURL(url, { width: 300, // 宽度,单位是像素 margin: 2, // 边距,留白区域 color: { dark: '#000000', // 二维码颜色 light: '#FFFFFF' // 背景颜色 } }).then(url => { // ... }); 

这里有个坑:width设置太大,base64字符串会非常长,可能会超出浏览器localStorage的长度限制。一般300-400就够用了。

打印适配

名片是要打印的,所以二维码在打印时的效果很重要。

我们用的是html2canvas把整个名片转成图片,然后打印。这里有几个要注意的点:

1. 设置合适的DPI

打印用的图片分辨率要比屏幕显示的高。我们是在生成名片的时候,整体放大2倍:

import html2canvas from 'html2canvas'; html2canvas(element, { scale: 2, // 2倍分辨率 useCORS: true, // 支持跨域图片 backgroundColor: '#ffffff' }).then(canvas => { // canvas转图片... }); 

2. 二维码大小要合适

名片尺寸通常是90mm × 54mm,二维码占的比例不能太大,否则扫的时候距离要拉得很远;也不能太小,否则打印出来不清楚。

我们测试下来,二维码宽度在名片总宽度的30%-40%比较合适。比如名片宽度360px,二维码大概120-140px。

3. 考虑留白

二维码周围要留点白边,不然打印出来边缘被裁了可能就扫不出来了:

QRCode.toDataURL(url, { margin: 2, // 至少留2个模块的边距 // ... }); 

下载二维码图片

有时候用户想单独下载二维码图片,可以直接用base64转blob下载:

function downloadQRCode(text, filename) { QRCode.toDataURL(text).then(url => { const link = document.createElement('a'); link.href = url; link.download = filename || 'qrcode.png'; link.click(); }); } 

或者配合file-saver库:

import { saveAs } from 'file-saver'; QRCode.toBlob(text).then(blob => { saveAs(blob, 'qrcode.png'); }); 

实时刷新支付状态

二维码生成后,要轮询后端接口看用户有没有支付成功:

handlePay() { buyRechargePower(this.rechargeList[this.activeRecharge].id).then(res => { this.orderInfo = res.data; QRCode.toDataURL(res.data.url).then(url => { this.orderInfo.url = url; this.openWeixinCode = true; // 每2秒查询一次支付状态 this.timer = setInterval(() => { this.getEnOrderStatus(); }, 2000); }); }); }, getEnOrderStatus() { getEnOrderStatus(this.orderInfo.orderId).then(res => { if (res.data.status == 1) { // 支付成功,清除定时器 if (this.timer) { clearInterval(this.timer); } this.$message.success("支付成功"); this.openWeixinCode = false; this.$emit("RechargeSuccess"); } }); } 

这里要注意的是,组件销毁的时候一定要清除定时器:

beforeDestroy() { if (this.timer) { clearInterval(this.timer); } } 

一些小技巧

1. 二维码加Logo

可以在生成的二维码中间加个小Logo,不过要注意:

  • Logo不能太大,一般占二维码面积的15%-20%
  • Logo颜色要和二维码有对比度
  • 最好用白色边框把Logo围起来

这个qrcode库本身不支持加Logo,得自己处理canvas。我们项目暂时没这个需求,就没做。

2. 批量生成

如果需要批量生成二维码,记得用Promise.all并行处理:

const urls = ['url1', 'url2', 'url3']; Promise.all(urls.map(url => QRCode.toDataURL(url))).then(results => { console.log(results); // 三张二维码的base64 }); 

3. 打印预览

打印前最好给用户一个预览功能,确认效果没问题再打印。浏览器有原生打印API:

window.print(); 

配合CSS的@media print可以控制打印时的样式:

@media print { .no-print { display: none; } .qrcode-container { page-break-inside: avoid; } } 

总结

二维码功能虽然看起来简单,但真要做好细节还挺多的:

  1. 容错率要选对:根据使用场景调整,别一味追求高容错
  2. 尺寸要合适:屏幕显示和打印的尺寸要求不一样,要分别优化
  3. 打印效果要测试:别光看屏幕上的效果,打印出来看看实际效果
  4. 定时器要清理:轮询类的代码一定要在组件销毁时清除定时器

Read more

无人机航拍图像拼接:自动识别重叠区域完成合成

无人机航拍图像拼接:自动识别重叠区域完成合成 引言:从航拍痛点出发,为何需要智能图像拼接? 在农业监测、城市规划、灾害评估等场景中,无人机航拍已成为获取高分辨率地表信息的核心手段。然而,单张航拍图像视野有限,必须通过多张图像拼接才能生成完整的全景图或地图。传统拼接方法依赖SIFT、ORB等特征匹配算法,在光照变化大、纹理重复(如农田、屋顶)的场景下容易失效,导致错位、断裂甚至拼接失败。 更关键的是,传统流程需手动指定图像对的重叠区域,效率低下且难以自动化。随着AI视觉技术的发展,基于深度学习的万物识别模型为解决这一问题提供了新思路——让模型“看懂”图像内容,自动判断哪些区域是重叠的,从而实现端到端的智能拼接。 本文将结合阿里开源的万物识别-中文-通用领域模型,构建一套完整的无人机航拍图像自动拼接方案,重点讲解如何利用该模型语义理解能力精准识别图像重叠区域,并完成高质量合成。 技术选型:为什么选择“万物识别-中文-通用领域”模型? 模型背景与核心优势 “万物识别-中文-通用领域”是阿里巴巴通义实验室推出的一款面向中文场景的通用图像识别模型。其核心目标是实现对日常物体、自

Mission Planner无人机地面站软件:从入门到精通的完整指南

Mission Planner无人机地面站软件:从入门到精通的完整指南 【免费下载链接】MissionPlanner 项目地址: https://gitcode.com/gh_mirrors/mis/MissionPlanner 想要轻松掌控无人机飞行任务,实现专业级的空中操作?Mission Planner作为功能全面的无人机控制软件,将复杂的飞行管理转化为直观的可视化体验。这款地面站系统不仅提供实时监控能力,更集成了完整的任务规划工具,满足从新手到专家的多层次需求。 🎯 为什么选择Mission Planner? 核心价值:你的智能飞行管家 想象一下,当你面对复杂的飞行参数时,Mission Planner就像一位经验丰富的飞行教官,帮你把专业术语转化为易懂的操作指南。无论你是航拍爱好者还是专业测绘人员,这款软件都能成为你最可靠的飞行伙伴。 关键优势:一应俱全的飞行解决方案 * 实时数据监控:飞行高度、GPS定位、电池状态一目了然 * 智能任务规划:从简单航点到复杂条件判断的全覆盖 * 硬件配置管理:支持主流飞控设备的参数优化 * 多场景应用:航拍、测绘、

构建机器人集群系统:ROS 2分布式控制实战指南

构建机器人集群系统:ROS 2分布式控制实战指南 【免费下载链接】PX4-AutopilotPX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot 本文将系统讲解如何基于ROS 2构建机器人集群系统,涵盖分布式控制技术原理、核心组件架构、快速部署流程及仓储场景应用。通过从零搭建多机器人协同框架,掌握分布式任务调度与异构机器人协作的关键技术,解决多机通信延迟、任务冲突等核心问题,为工业级机器人集群应用提供完整技术方案。 🔥 技术原理实现方案 机器人集群系统通过分布式控制架构实现多智能体协同,核心在于解决三个关键问题:节点间状态一致性、任务动态分配和实时通信保障。与传统集中式控制相比,分布式架构具有更高的容错性和扩展性,单个节点故障不会导致整个系统瘫痪。 分布式控制的核心算法包括: * 基于一致性协议的状态同步(如Raft算法) * 分布式任务分配的匈牙利算法 * 冲突避免的分布式路径规划 图1:机器人集群分布式控制架构示意图,展示状态感知、任务规划、执行控制的分层协作

MCAP :机器人数据容器的全面实践指南

Outline: MCAP 已形成完整工具链生态: * Foxglove Studio:可视化分析工具 * mcap-cli:跨平台命令行工具 * AWS RoboMaker:原生云存储支持 随着 IEEE 正在制定的 P3196 机器人数据标准,MCAP 正在演进为行业基础架构的重要组成。其设计哲学启示我们:优秀的数据格式应该在存储效率与读取便利间找到平衡,这正是 MCAP 在机器人革命中脱颖而出的关键。 参考资料: 1. https://juejin.cn/post/7508575831791812658 https://getiot.tech/fileformat/mcap/ MCAP :机器人数据容器的全面实践指南 在机器人和自动驾驶系统开发中,高效存储和处理传感器数据是核心挑战之一。传统的 ROS bag 格式在面对大规模、多类型数据时逐渐暴露出性能瓶颈,而 MCAP(Modular Container for Asynchronous