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,一经查实,立即删除!

相关文章

这个世界并不是掌握在那些嘲笑者的手中,而恰恰掌握在能够经受得住嘲笑与批评仍不断往前走的人手中。

这个世界并不是掌握在那些嘲笑者的手中&#xff0c;而恰恰掌握在能够经受得住嘲笑与批评仍不断往前走的人手中。

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

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;…

【Linux】文件切割排序 cut sort

文章目录 Linux文件切割命令&#xff1a;cut1. cut命令的基本用法2. cut命令的选项和参数3. cut命令的实际应用案例 Linux文件排序命令&#xff1a;sort1. sort命令的基本用法2. sort命令的选项和参数3. sort命令的实际应用案例 常见问题和解决方案1. cut和sort命令的联合使用2…

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…

微信小程序元素水平居中或垂直居中

最近在做一个微信小程序的项目&#xff0c;其中涉及到css样式实现将<navigator>标签内的图片和文本元素垂直排列&#xff0c;并水平居中。在尝试实现的过程中&#xff0c;将元素在标签内的所有排列情况都顺带实现了。上代码&#xff1a; index.wxml <navigator url&…

unity中的材质(material)贴图(texture)着色器(shader)介绍

TOC 在unity中&#xff0c;材质&#xff08;material&#xff09;、贴图&#xff08;texture&#xff09;和着色器&#xff08;shader&#xff09;是构建和渲染3D对象外观的基本概念 材质(material) 定义&#xff1a;材质是一个用于定义物体外观的资源&#xff0c;它将材质属性…

在模式的学习中发现了之前没有留意过的点

在模式的学习中发现了之前没有留意过的点 init 和 new 方法 通常我们在类中使用__init__方法来初始化对象, new()方法用于创建实例&#xff0c;类实例化之前会首先调用&#xff0c;它是class的方法&#xff0c;是个静态方法。而__init__()方法用户初始化实例&#xff0c;该方…

微积分复习笔记 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&…

传奇996_15——有/无补丁添加衣服(角色/玩家)

过程和添加武器过程全部一样&#xff0c;区别在于分类&#xff0c;一个是武器&#xff0c;一个是角色/玩家 无补丁 直接修改装备表&#xff0c;没错和修改武器一样&#xff0c;还是修改装备表 有补丁 打包&#xff0c;打包文件放在D:\chuanqibanben2\客户端\dev\anim\playe…

【K8S】kubernetes-dashboard.yaml

https://raw.githubusercontent.com/kubernetes/dashboard/v3.0.0-alpha0/charts/kubernetes-dashboard.yaml 以下链接的内容&#xff1a; 由于国内访问不了&#xff0c;找到一些方法下载了这个文件内容&#xff0c; 部署是mages 对象的镜像 WEB docker.io/kubernetesui/dash…

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

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

Spearman相关系数和P值计算的MATLAB代码

% 导入数据 data readtable(data.xlsx);% 获取列名 columnNames data.Properties.VariableNames; numCols width(data);% 初始化Spearman相关系数和P值矩阵 spearmanCorr zeros(numCols); spearmanPValues zeros(numCols);% 计算Spearman相关系数及P值 for i 1:numColsfo…