vue生成二维码中间自定义logo并截图分享

在这里插入图片描述
需求描述:在公众号中,生成二维码,并在二维码中央添加自定义logo,然后生成一张分享给好友的 二维码图片。

一、用到的依赖包

npm install --save html2canvas
<script src='https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js'></script>
<script src="https://cdn.bootcss.com/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>
<template>
	<div>
		<div class="userBox">
			<div id='qrcode'></div>
		</div>
		<el-dialog :visible="dialogTableVisible" width="90%" @close="closeDialog" top="10vh">
            <img src="../../image/close-btn.png" class="close-btn" @click="closeDialog" alt="">
            <div v-if="!shareQrImg" class="qr-bg" id="qrBg" >
                <h2>关注公众号开启平台功能</h2>
                <div id="imgContainer" class="imgContainer"></div>
                <span>长按二维码,分享给好友!</span>
                <img src="../../image/dialog-bg.png" class="qr-bg-img" alt="">
            </div>
            <!--这个img 标签,可以在手机端长按分享图片-->
            <img v-else :src="shareQrImg" alt="" style="width: 326px; height: 467px;">
        </el-dialog>
	</div>
</template>

<script>
	data () {
		return {
			canvas: null,
            canvaswidth: 0,
            canvasheight: 0,
            // 二维码宽高
            qrcodewidth: 400,
            qrcodeheight: 400,
            qrcodeTopOffset: 59,
            dialogTableVisible: false,
            shareQrImg: ''
		};
	},
	async created() {
		//canvas宽高
		this.canvaswidth = this.qrcodewidth;
		this.canvasheight = this.qrcodeheight + this.qrcodeTopOffset + 50;
	},
	methods: {
		closeDialog () {
			this.dialogTableVisible = false;
			$('#imgContainer').empty();
			$('#qrcode').empty();
			this.shareQrImg = '';
			this.canvas.width = this.canvaswidth;
			this.canvas.height = this.canvasheight;
			var ctx = this.canvas.getContext('2d');
			ctx.clearRect(0, 0, this.canvaswidth, this.canvasheight);
		},
		//解决中文乱码问题
		toUtf8(str) {
			var out, i, len, c;
			out = "";
			len = str.length;
			for (i = 0; i < len; i++) {
				c = str.charCodeAt(i);
				if ((c >= 0x0001) && (c <= 0x007F)) {
					out += str.charAt(i);
				} else if (c > 0x07FF) {
					out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
					out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
					out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
				} else {
					out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
					out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
				}
			}
			return out;
		},
		initQrCodeImg (url) {
			try {
				//二维码宽高
				//logo宽高
				var logowidth = 84;
				var logoheight = 84;
				//文字描述位置
				var textleft = this.qrcodewidth / 2;
				var texttop = 39;
				//logo位置
				var logoleft = (this.qrcodewidth - logowidth) / 2;
				var logotop = (this.qrcodeheight - logoheight) / 2 + this.qrcodeTopOffset;
				const qrcode = $('#qrcode');
				qrcode.qrcode({
					render : 'canvas',
					text : this.toUtf8(url),
					width : this.qrcodewidth,
					height : this.qrcodeheight,
					background : '#ffffff',
					foreground : '#000000',
				});
				this.canvas = qrcode.find('canvas').get(0);
				var img = new Image();
				img.crossOrigin = 'anonymous';
				img.src = this.canvas.toDataURL('image/png');
				img.onload = () => {
					this.canvas.width = this.canvaswidth;
					this.canvas.height = this.canvasheight;
					var ctx = this.canvas.getContext('2d');
					//设置画布背景
					ctx.fillStyle = 'transparent';
                    ctx.fillRect(0, this.qrcodeTopOffset, this.canvas.width, this.canvas.height);
                    //设置文字样式
                    ctx.fillStyle = '#7E7E7E';
                    ctx.font = '400 ' + 29 + 'px PingFangSC, PingFang SC';
                    ctx.textAlign = 'center';
                    //文字描述
                    ctx.fillText("AD中台,您的高效拍档!", textleft, texttop);
                    ctx.fillStyle = '#BBBBBB';
                    ctx.font = '400 ' + 26 + 'px PingFangSC, PingFang SC';
                    ctx.textAlign = 'center';
                    //文字描述
                    const date = new Date(Date.now() + 7 * 86400000);
                    const month = (date.getMonth() + 1) < 10 ? '0' + (date.getMonth() + 1) : (date.getMonth() + 1);
                    const day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
                    ctx.fillText(`有效期至${date.getFullYear()}-${month}-${day}`, textleft, this.qrcodeTopOffset + this.qrcodeheight + 42);
                    //绘制二维码
                    ctx.drawImage(img, 15, this.qrcodeTopOffset + 12, this.canvaswidth - 30, this.canvasheight - 120);
                    //设置logo
                    var logo = new Image(logowidth, logoheight);
                    logo.src = '../../image/qr-logo.png';
                    logo.onload = () => {
                    	ctx.drawImage(logo, logoleft, logotop, logowidth, logoheight);
	                    this.dialogTableVisible = true;
                        this.$nextTick(() => {
							var image = new Image();
							image.crossOrigin = 'anonymous';
                            image.classList.add('imgContainer');
                            image.src = this.canvas.toDataURL('image/png');
                            document.getElementById('imgContainer').appendChild(image);
                            // 替换为目标元素的id或class
                            const element = document.getElementById('qrBg');
                            html2canvas(element, {
								backgroundColor: null,
                                scale: 7.5,
                                height: element.scrollHeight - 1,
                                width: element.scrollWidth - 2,
                                dpi: window.devicePixelRatio * 2, //设备像素比
                                x: 1
                            }).then((canvas) => {
								const image = canvas.toDataURL('image/png');
								this.shareQrImg = image;
							});
						});
					}
				}
			} catch (e) {
				console.error(123, e);
			}
		},
	}
</script>
<style>
	.imgContainer {
        width: 176px;
	}
    #qrcode {
        display: none;
        position: absolute;
        top: 0px;
        left: -500px;
    }
    .el-dialog {
        background-color: transparent;
        box-shadow: none;
    }
    .el-dialog__body {
        display: flex;
        justify-content: center;
        padding: unset;
    }
    .el-dialog__headerbtn {
        display: none;
    }
    .qr-bg {
        position: relative;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        width: 326px;
        height: 467px;
        background-color: transparent;
    }
    .qr-bg .qr-bg-img {
        position: absolute;
        width: 326px;
        height: 467px;
        z-index: -1;
    }
    .qr-bg h2 {
        margin-top: 117px;
        font-family: PingFangSC, PingFang SC;
        color: #000000;
        font-weight: 600;
        font-size: 18px;
    }
    .qr-bg span {
        margin-top: 11px;
        font-family: PingFangSC, PingFang SC;
        font-weight: 600;
        font-size: 16px;
        color: #3E8BFD;
    }
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nvm 安装说明

1、下线nvm地址 https://nvm.uihtm.com/2、安装步骤 2.1、双击解压后的exe 2.2、选择I accept…&#xff0c;然后点击next 2.3、选择nvm安装位置,选择好后点击next 2.4、选择nodejs的安装位置&#xff0c;点击next&#xff0c;记住你的nodejs路径&#xff01;甚至可以复制这…

[数据集][目标检测]叶子计数检测数据集VOC+YOLO格式240张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;240 标注数量(xml文件个数)&#xff1a;240 标注数量(txt文件个数)&#xff1a;240 标注类别…

C语言的数据结构:串、数组、广义表

一、串 1、串的定义 串是一个线性表&#xff0c;但其节点中的内容只能为字符&#xff0c;所以也称为字符串。 字符串中可以有多个字符&#xff0c;也可以没有字符。没有字符的叫作&#xff1a;空串。 空串&#xff1a;""。 有值的串&#xff1a;"1123"。 只…

Handler通信机制

目标&#xff1a; 1.Handler和Looper什么关系&#xff1f; 一个Looper对应一个MessageQueue&#xff0c;可以多个handler往MessageQueue发送消息。 2.一个线程有几个Handler&#xff1f; 3.Handler内存泄漏的原因&#xff1f; 4.使用Message时如何创建它&#xff1f; 5.子…

重生奇迹MU剑士介绍

剑士拥有过人的体力及华丽的剑术&#xff0c;加上属于近距离攻击型职业&#xff0c;就算没有其他角色的帮助也可自行锻炼。由于剑士是剑术的专家&#xff0c;所以无法学习魔法&#xff0c;但与其他角色组队冒险时&#xff0c;因优异的体力通常是担任先锋角色。剑士等级达到150级…

SSM 离散数学线上考试系统-计算机毕业设计源码83059

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;高校当然也不例外。离散数学线上考试系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采…

VB.NET实现上位机自动识别可用串口

在实际应用中有时会牵扯到挑选可用串口&#xff0c;比如上位机和从站设备使用Modbus RTU协议进行通讯时需要选择COM串口&#xff0c;每次启动连接前都在设备管理器查看较为麻烦&#xff0c;可以设置一个串口自动识别功能&#xff0c;如果选择了错误的串口还可以提示串口选择错误…

借助Historian Connector + TDengine,打造工业创新底座

在工业自动化的领域中&#xff0c;数据的采集、存储和分析是实现高效决策和操作的基石。AVEVA Historian (原 Wonderware Historian) 作为领先的工业实时数据库&#xff0c;专注于收集和存储高保真度的历史工艺数据。与此同时&#xff0c;TDengine 作为一款专为时序数据打造的高…

排名前五的 Android 数据恢复软件

正在寻找数据恢复软件来从 Android 设备恢复数据&#xff1f;本指南将为您提供 5 款最佳 Android 数据恢复软件。浏览这些软件&#xff0c;然后选择您喜欢的一款来恢复 Android 数据。 ndroid 设备上的数据丢失可能是一种令人沮丧的经历&#xff0c;无论是由于意外删除、系统崩…

【Redis】Redis常见问题——缓存更新/内存淘汰机制/缓存一致性

目录 回顾数据库的问题如何提高 mysql 能承担的并发量&#xff1f;缓存解决方案应对的场景 缓存更新问题定期生成如何定期统计定期生成的优缺点 实时生成maxmemory 设置成多少合适呢&#xff1f;项目类型上来说 新的问题 内存淘汰策略Redis淘汰策略为什么redis要内存淘汰内存淘…

Echarts自定义地图显示区域,可以显示街道,小区,学校等区域

&#x1f680;&#x1f680;​​​​​​​&#x1f680;​​​​​​​目录 自定义地图 1. 选择边界生成器 2.导出JSON&#xff0c;在vue中使用&#xff1a; 3. vue中使用自定义地图 4.两个面、两条线&#xff0c;4个features&#xff0c;在每一个properties中添加name属…

英语四六级考试听力同频无线转发系统在上海电子信息职业技术学院的应用

英语四六级考试听力同频无线转发系统在上海电子信息职业技术学院的应用 由北京海特伟业科技有限公司任洪卓发布于2024年6月12日 一、 英语考试听力同频无线转发系统建设背景 英语听力考试作为评估大学生英语能力的重要一环&#xff0c;其顺利进行对于保障考试公平性和学生权益…

6月报名 | 海克斯康Actran风机类气动噪声分析培训

您好&#xff01;感谢您长期以来对优飞迪科技与海克斯康的关注与支持。我们诚邀您参加海克斯康Actran风机类气动噪声分析培训&#xff0c;特邀海克斯康原厂讲师将以实操为基础&#xff0c;结合真实案例&#xff0c;手把手帮您解锁噪声仿真关键技术。 活动主题&#xff1a; 海…

金石传拓非遗技艺端午专场活动之精彩瞬间

6月10日端午节下午&#xff0c;由致公党润州区基层委二支部举办的“凝心铸魂强根基&#xff0c;端午追远贺盛世”金石传拓体验活动在镇江万达广场隆重举行。近30名党员及其家属参加了本次活动&#xff0c;活动由润州区二支部主委吴娉主持。 端午节&#xff0c;又称端阳节&#…

视频转换器推荐哪个好?多款视频转换器任你选

#快要溢出来的分享欲# 在数字化时代&#xff0c;视频已成为我们生活中不可或缺的一部分。无论是观看电影、学习课程还是记录生活&#xff0c;视频都扮演着重要角色。 然而你也知道&#xff0c;现在的视频格式五花八门&#xff0c;想在不同的设备上播放&#xff0c;就得转换格…

加速下载2024IDM下载器让网速飞起来!

网速慢&#xff0c;文件大&#xff0c;下载难。 这或许是很多人的上网日常。 尤其是当下载进度达到99.8%时&#xff0c;突然提示你下载失败&#xff0c;需要重新来过…… IDM马丁版下载如下: https://wm.makeding.com/iclk/?zoneid34275 idm最新绿色版一键安装包链接&#…

潇洒郎: 腾讯DDNS域名解析, DNSPod API使用示例—实时更新本地IPV6地址到DNS解析

1、新人一元购买一个域名 (到期后换身份,对于小白来说,玩玩域名而已,家人的身份就足够用几年了) 2、域名操作 查看我的域名信息 点击管理DNS解析 点击解析 如果之前有解析记录,则可导出 下载解压 查看一下

【NoSQL数据库】Redis Cluster集群(含redis集群扩容脚本)

Redis Cluster集群 Redis ClusterRedis 分布式扩展之 Redis Cluster 方案功能数据如何进行存储 redis 集群架构集群伸缩向集群中添加一个新的master节点&#xff0c;并向其中存储 num10 .脚本对redis集群扩容缩容&#xff0c;脚本参数为redis集群&#xff0c;固定从6001移动200…

简单记录常用五大机器学习模型

一、线性回归模型 线性回归模型是机器学习中一种基本且常用的回归预测模型。它主要用于预测连续值输出,例如房价、气温、用电量等。 1.1 基本原理 线性回归模型主要是尝试找到一种特征值(自变量)和目标值(因变量)之间的线性关系。模型的数学表达式为: 其中,是目标值,…

数字图像处理系列 | 通过相关性进行模板匹配 (5)

文章目录 1. 模板匹配模板匹配的公式表示 2. Convolution vs. Correlation3. Problem with Cross-Correlation4. 解决办法&#xff1a; Normalized Cross-Correlation: en5. 图片举例加深理解6. 参考书 1. 模板匹配 模板匹配的公式表示 CROSS-CORRELATION 2. Convolution vs…