Vue生成名片二维码带logo并支持下载

一、需求

生成一张名片,名片上有用户信息以及二维码,名片支持下载功能(背景样式可更换,忽略本文章样图样式)。

二、参考文章

这不是我自己找官网自己摸索出来的,是借鉴各位前辈的,学以致用,自己运用到项目中实现需求,做个记录,以便将来需要,方便查看

链接:

Vue中两种生成二维码(带logo)并下载方式_vue qrcode logo图标-CSDN博客

vue中html2canvas的使用_vue html2canvas-CSDN博客

三、实现代码

1.qrcode生成二维码

下载依赖

npm i qrcode

注:这里我将生成二维码的实现封装成一个组件,以便复用

HTML: 

<template><div class="qrcode-box"><!-- 二维码主要部分 --><canvas id="canvas" ref="qrCanvas" title="扫描二维码"></canvas><!-- logo 用定位定到二维码中间的 --><div class="card-logo"><imgsrc="../../assets/images/userCard/card_logo.png"class="card-img"alt="名片"/></div></div>
</template>

JS:这里只生成了二维码

<script>
import QRCode from "qrcode"; //引入生成二维码插件
export default {name: "qrcode",props: {canvasWidth: {//画布的宽度default: 87,type: Number,},canvasHeight: {//画布的高度default: 87,type: Number,},url: {//生成二维码的地址default: "",// type: String,required: true,},logoUrl: {//二维码的logodefault: require("@/assets/images/userCard/card_logo.png"),type: String,// required:true},},mounted() {//生成二维码this.generateQRCode();//设置logo图标,这里是可以生成logo的,但是设计稿的二维码宽高小于100,导致生成的二维码模糊,所以我用定位的方式将logo定位到二维码中间// if (this.logoUrl != "") {//   let myCanvas = this.$refs.qrCanvas;//   let ctx = myCanvas.getContext("2d");//   // 在Canvas画布 添加图片//   let img = new Image();//   // img.setAttribute("crossOrigin", "Anonymous");//   img.crossOrigin = "Anonymous"; //解决Canvas.toDataURL 图片跨域问题//   img.src = this.logoUrl;//   img.onload = () => {//     //第一个设置的元素,第二三是位置,后面两个是宽和高//     //居中的位置计算为 (二维码宽度-img宽度)/2//     let codeWidth = (this.canvasWidth * 0.75) / 2;//     let codeHeight = (this.canvasHeight * 0.75) / 2;//     ctx.drawImage(//       img,//       codeWidth,//       codeHeight,//       this.canvasWidth * 0.25,//       this.canvasHeight * 0.25//     );//   };// }},data() {return {};},methods: {// 生成的二维码宽高小于100的时候会读取不到信息,生成的二维码信息不够齐全,模糊generateQRCode() {let opts = {errorCorrectionLevel: "M", //4个容错级别(L:7%, M: 15%, Q: 25%, H: 30%),指二维码被遮挡可以扫出结果的区域比例type: "image/png", //生成的二维码类型quality: 0.3, //二维码质量margin: 1, //二维码留白边距width: this.canvasWidth, //宽height: this.canvasHeight, //高text: "1111", //二维码内容color: {light: "#ffffff", //背景色},};// 将获取到的数据(val)画到msg(canvas)上,加上时间戳动态生成二维码const canvas = this.$refs.qrCanvas;QRCode.toCanvas(canvas, this.url, opts, (error) => {if (error) console.error(error);});},},
};
</script>

CSS: 

<style lang="scss" scoped>
.qrcode-box {position: relative;.card-logo {width: 20px;height: 20px;position: absolute;top: 34px;left: 34px;img {width: 100%;height: 100%;}}
}
</style>

2.html2canvas 生成图片(这里只展示部分代码)

二维码logo在这里用定位定到二维码中间,我将名片也封装了一个组件
    <div class="qrcode_pic" v-if="cardInfo.qrCodeUrl"><QRcodeComponent :url="cardInfo.qrCodeUrl" /><div class="qrcode_text"><imgsrc="../../../../../assets/images/userCard/qrcode_text.png"class="code-img"alt="二维码"/></div></div>
这里是下载使用的组件
       <div class="card-box"><div class="down_btn"><el-button type="text" @click="download"><i class="el-icon-download"></i>下载</el-button></div><div ref="content" class="down-content"><UserCard /></div></div>
<script>
import html2canvas from "html2canvas";data(){download() {const ref = this.$refs.content; // 截图区域html2canvas(ref, {// 以下字段可选width: 560, // canvas宽度height: 355, // canvas高度x: 0, // x坐标y: 0, // y坐标scrollY: 0,scrollX: 0,backgroundColor: null,// backgroundColor: "#e8f4ff",padding:0,borderRadius: 5,scale: 2, // 处理模糊问题:按照比例增加分辨率,默认值1,dpi: 300, // 处理模糊问题:每英寸的像素,也就是扫描精度,dpi越低,扫描清晰度越低,默认值96,建议修改为300useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题}).then((canvas) => {const dataURL = canvas.toDataURL("image/png");const creatDom = document.createElement("a");document.body.appendChild(creatDom);creatDom.href = dataURL;creatDom.download = "我的名片";creatDom.click();});},
}
</script>

四、遇到的问题及解决方案 

1.二维码logo模糊

刚开始我是在mounted里直接用画布生成,但是很模糊,经过查找发现可以用定位将logo定到二维码中间,可以实现效果,在上面代码上有注释标明。

2.名片下载模糊

之前我是将图片以背景图片的形式放到盒子里,这样我用html2canvas 生成图片下载下来后很模糊,我就用img的形式定位到盒子上,下载后就清晰很多啦

  // background-image: url("../../../../../assets/images/userCard/card.png");// background-size: cover;
    <div class="qrcode_pic" v-if="cardInfo.qrCodeUrl"><QRcodeComponent :url="cardInfo.qrCodeUrl" /><div class="qrcode_text"><imgsrc="../../../../../assets/images/userCard/qrcode_text.png"class="code-img"alt="二维码"/></div></div>

五、恭喜恭喜

恭喜你我又学会了新的东西,真棒呀真棒呀,祝你我今天开心呐,有问题请留言,看见就会回的,不过不一定会。

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

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

相关文章

零基础学西班牙语,柯桥专业小语种培训泓畅学校

No te comas el coco, seguro que te ha salido bien la entrevista. Ya te llamarn. 别瞎想了&#xff01;我保证你的面试很顺利。他们会给你打电话的。 这里的椰子是"头"的比喻。在西班牙的口语中&#xff0c;我们也可以听到其他同义表达&#xff0c;比如&#x…

【Python各个击破】numpy

简介 NumPy是一个开源的Python库&#xff0c;它提供了一个强大的N维数组对象和许多用于操作这些数组的函数。它是大多数Python科学计算的基础&#xff0c;包括Pandas、SciPy和scikit-learn等库都建立在NumPy之上。 安装 !pip install numpy导入 import numpy as np用法 # …

一文详细讲解进销存系统(附架构图、流程、功能介绍)

企业经营的七大要素是“人、财、物、产、供、销、存”&#xff0c;进销存管理就占到了其中的多项。然而&#xff0c;许多企业在进销存管理方面面临着诸多痛点问题&#xff0c;例如库存管理混乱、采购销售流程不清晰、数据不准确等。这些问题不仅影响企业的运营效率&#xff0c;…

Error in eval(family$initialize): y值必需满足0 <= y <= 1解决

今天在使用R语言对Weekly进行交叉验证时&#xff0c;发生如下报错&#xff1a; 错误于eval(family$initialize): y值必需满足0 < y < 1 错误代码为&#xff1a; Weekly<-read.csv("Weekly.csv") set.seed(1) attach(Weekly) glm.fit1 glm(Direction~Lag…

[论文阅读] Improved Baselines with Visual Instruction Tuning

启发&#xff1a; 1、LLaVA-1.5和LLaVA以及其他大模型相比&#xff0c;做出了哪些改进&#xff1f; &#xff08;1&#xff09;使用CLIP-ViT-L-336px作为视觉编码器&#xff0c;使模型能处理336px的高分辨率图像&#xff0c;这使得模型能从图像中提取出更多细节信息。此外&am…

微积分复习笔记 Calculus Volume 1 - 4.2 Linear Approximations and Differentials

4.2 Linear Approximations and Differentials - Calculus Volume 1 | OpenStax

万圣夜,Codigger

在这个神秘的万圣节&#xff0c;让Codigger&#xff0c;一个专业的分布式操作系统&#xff0c;带领你踏入未知的编程世界&#xff01;就像变装成各种角色一样&#xff0c;Codigger也以其独特的能力和技巧&#xff0c;在数字世界中展现无穷魅力。让我们一起在这个神秘的节日里&a…

《神经网络助力战场车辆及部件损毁识别与评估》

《神经网络助力战场车辆及部件损毁识别与评估》 一、战场车辆损毁评估的重要意义二、传统战场车辆损毁评估方法&#xff08;一&#xff09;视觉评估法&#xff08;二&#xff09;仪器检测技术 三、神经网络在战场车辆损毁评估中的应用案例&#xff08;一&#xff09;射击毁伤评…

信而泰防火墙安全测试解决方案:为网络安全保驾护航

在当今数字化时代&#xff0c;网络安全至关重要。防火墙作为网络安全的第一道防线&#xff0c;其性能和可靠性直接影响到网络的安全性。信而泰提供的防火墙安全测试解决方案&#xff0c;旨在通过全面的测试流程&#xff0c;确保防火墙能够高效、准确地执行其安全任务。 针对防火…

Pinctrl子系统pinctrl_desc结构体进一步介绍

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入 input子系统专栏&#xff1a; 专栏地址&#xff1a;input子系统input角度&#xff1a;I2C触摸屏驱动分析和编写一个简单的I2C驱动程序 – 末片&#xff0c;有往期内容观看顺序 I2C子系统专栏&#xff1a;…

简单的kafkaredis学习之redis

简单的kafka&redis学习之redis 2. Redis 2.1 什么是Redis Redis是一种面向 “Key-Value” 数据类型的内存数据库&#xff0c;可以满足我们对海量数据的快速读写需求&#xff0c;Redis是一个 NoSQL 数据库&#xff0c;NoSQL的全称是not only sql&#xff0c;不仅仅是SQL&…

Java 输入与输出(I\O)之对象流与对象序列化

什么是Java的对象流&#xff1f; Java对象流是用于存储和读取基本数据类型数据或对象数据的输入输出流。 Java的对象流可分为两种&#xff1a; 1&#xff0c;对象输入流类ObjectInputStream 用于从数据源读取对象数据&#xff0c;它是可以读取基本数据类型数据或对象数据的输…

GitHub 上传项目保姆级教程

构建项目仓库 登录 GitHub 并进入主页。点击右上角的 New 按钮&#xff0c;进入创建新仓库页面。输入仓库名称和描述&#xff08;可选&#xff09;&#xff0c;选择是否公开&#xff08;Public&#xff09;或私有&#xff08;Private&#xff09;。可以选择是否初始化仓库&…

计算机网络:网络层 —— 路由选择与静态路由配置

文章目录 路由选择路由选择的基本概念路由选择算法路由选择策略 路由器的工作原理路由表静态路由配置默认路由特定主机路由 路由选择 路由选择&#xff08;Routing&#xff09;是网络层的一个关键功能&#xff0c;负责在源和目的地之间选择最佳路径&#xff0c;以确保数据包高…

Pytest-Bdd-Playwright 系列教程(5):仅执行测试用例的收集阶段

Pytest-Bdd-Playwright 系列教程&#xff08;5&#xff09;&#xff1a;仅执行测试用例的收集阶段 一、为什么需要仅收集测试用例二、应用场景三、方法详解【方法1】&#xff1a;添加pytest.ini文件的addopts配置项【方法2】&#xff1a;通过命令行参数运行 四、CI/CD 环境下的…

联想笔记本电脑睡眠后打开黑屏解决方法

下载联想机器睡眠无法唤醒修复工具 下载地址&#xff1a;https://tools.lenovo.com.cn/exeTools/detail/id/233/rid/6182522.html 使用完后重启电脑&#xff0c;问题解决。

(11)(2.1.6) Hobbywing DroneCAN ESC(一)

文章目录 前言 1 连接和配置 2 参数说明 前言 具有 CAN 接口&#xff08;including these&#xff09;的业余 ESC 支持 DroneCAN&#xff0c;它允许自动驾驶仪通过 CAN 控制 ESC /电机&#xff0c;并检索单个转速、电压、电流和温度。 具有 CAN 接口&#xff08;including …

AI助力医疗:未来的医生会是机器人吗?

内容概要 在这一场医疗科技的新浪潮中&#xff0c;AI医疗正以前所未有的速度渗透到各个角落。随着技术的飞速进步&#xff0c;人工智能成为了推动医疗领域革新的重要力量。从精准诊断到个性化治疗&#xff0c;AI正在帮助医生们更快速、准确地分析患者的病情&#xff0c;提高了…

HTMLCSS:3D旋转动画机器人摄像头

效果演示 创建了一个3D机器人摄像头效果。 HTML <div class"modelViewPort"><div class"eva"><div class"head"><div class"eyeChamber"><div class"eye"></div><div class&quo…

大型商场应急响应系统开发:SpringBoot篇

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…