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

news2024/10/6 2:23:29

在这里插入图片描述
需求描述:在公众号中,生成二维码,并在二维码中央添加自定义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>

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

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

相关文章

【APP移动端自动化测试】第一节.环境配置和adb调试工具

文章目录 前言一、Java环境搭建二、AndroidSDK环境搭建三、Android模拟器安装四、adb调试工具基本介绍 4.1 adb构成和基本原理 4.2 adb获取包名&#xff0c;界面名 4.3 adb文件传输 4.4 adb获取app启动时间 4.5 adb获取手机日志 4.6 adb其他有关…

室内、户外安防监控超低功耗24g人体雷达感应模块,智能门铃、灯光控制新体验

在当今这个智能科技日新月异的时代&#xff0c;雷达感应模块正逐渐成为智能家居领域的一颗璀璨新星。其超低功耗、无误触、无漏触等特性&#xff0c;以及在户外环境下能够智能过滤环境干扰的独特优势&#xff0c;使得雷达感应模块在智能门铃、灯光照明等方面的应用越来越广泛。…

【C++】list 容器的增删改查---模拟实现(图例超详细解析!!!)

目录 一、前言 二、 list 容器的模拟实现思 ✨ 模块分析 ✨ 作用分析 三、list的节点类设计 四、list 的迭代器类设计 ⭐ 迭代器类--存在的意义 ⭐ 迭代器类--模拟实现 &#x1f4a6; 模板参数 和 成员变量 &#x1f4a6; 构造函数 &#x1f4a6; 运算符的重载 &…

如何一键式完成等级logistic回归分析?

Logistic回归分析用于研究X对Y的影响&#xff0c;并且要求Y必须为分类数据&#xff0c;并且根据Y的分类不同&#xff0c;需要选用不同的模型。 如果Y为二分类&#xff0c;如患病和不患病&#xff0c;那么普通的二元logistic回归就可以解决问题;如果Y为有序多分类&#xff0c;如…

如何成为嵌入式系统工程师?

各位朋友&#xff0c;如果你们有意向投身于嵌入式开发领域&#xff0c;那么强烈建议你们在软件和硬件两个方面均展开深入且全面的学习。 嵌入式计算机作为嵌入式系统的核心技术支撑&#xff0c;其是直接面向用户、产品以及应用的&#xff0c;无论是软件还是硬件方面都能发挥重要…

Windows10安装配置Docker客户端和WSL2与Hyper-V虚拟机

一、需求说明 需要在Windows系统中安装配置Docker的客户端,方便直接管理配置docker镜像容器内容。 二、Windows10安装Docker客户端步骤 2.1、下载安装Docker客户端 对于Windows 10以下的用户,推荐使用Docker Toolbox Windows安装文件:http://mirrors.aliyun.com/docker-…

附件采集文件类型识别方案

背景 咱们做爬虫的或多或少都会遇到附件下载&#xff0c;一般情况站点提供的附件链接会直接声明文件的类型&#xff0c;但是有些提供的只是一个api&#xff0c;然后触发下载时再返回附件文本&#xff0c;这个时候我们是没法直接知道文件类型的&#xff0c;而我们使用requests下…

为了能够实现躺在家里办公,我发现了teamOS,免费搞定在线编辑,还能满足多人协同编辑,太香了

在快节奏的现代生活中&#xff0c;传统的办公室模式似乎变得越来越局限。 在出差途中&#xff0c;在一个个的临时会议上&#xff0c;我们都越来越需要一个更为灵活、高效的工作模式。 想要实现随时随地打开文件&#xff0c;与团队成员实时协作&#xff0c;共同编辑文档&…

on ethernetPacket事件函数接收报文时标准的处理流程

on ethernetPacket可以用来接收指定报文,并根据一些判断条件,比如目标MAC地址和IP地址判断报文是否是发给"我"的。 比如想通过on ethernetPacket *来接收发送给02:00:00:00:00:17和192.168.0.17的SYN报文。CAPL代码可以这样写: variables {ethernetPacket …

Vue.js结合ASP.NET Core构建用户登录与权限验证系统

1. 环境准备2. 创建项目3. Vue配置步骤一: 安装包步骤二: 配置文件步骤三: 页面文件 4. 后台配置 在本教程中&#xff0c;我将利用Visual Studio 2022的强大集成开发环境&#xff0c;结合Vue.js前端框架和ASP.NET Core后端框架&#xff0c;从头开始创建一个具备用户登录与权限验…

SwiftUI 中的自定义Shape

在SwiftUI中&#xff0c;Shape协议允许开发者定义可重用的图形&#xff0c;这些图形可以用于绘制界面元素&#xff0c;如按钮、背景、边框等。通过实现 Shape 协议&#xff0c;可以创建完全自定义的图形&#xff0c;并控制其绘制方式。本文将详细介绍如何在 SwiftUI 中创建自定…

Qt-Advanced-Docking-System的学习

Qt-Advanced-Docking-System使用说明_cdockmanager-CSDN博客 示例1&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include "DockManager.h" #include "QtDock/DockAreaWidget.h" namespace Ui { class MainWind…

计算机组成原理之运算方法和运算器

文章目录 数据与文字的表示方法定点表示法机器码&#xff08;机器数&#xff09;原码 反码补码移码 浮点表示法尾数规格化 数据与文字的表示方法 定点表示法 机器码&#xff08;机器数&#xff09; 正数的原码、反码、补码一样&#xff0c;负数的原码、反码、补码的符号位均为…

迅狐矩阵系统:智能化多平台内容管理与发布

迅狐矩阵系统是一套专为提高数字内容管理和发布效率而设计的综合性解决方案。它通过一系列智能化功能&#xff0c;帮助用户实现多平台内容的高效管理和发布&#xff0c;以下是系统的几大核心优势&#xff1a; 多平台绑定发布 迅狐矩阵系统支持用户绑定多个平台的多个账号&…

linux驱动学习(十一)之内核时钟

需要板子一起学习的可以这里购买&#xff08;含资料&#xff09;&#xff1a;点击跳转 一、内核时钟 1、内核时钟 内核时钟&#xff08;Kernel Clock&#xff09;&#xff0c;也称为系统时钟&#xff08;System Clock&#xff09;或滴答时钟&#xff08;Tick Timer&#xff0…

使用LANGCHAIN和GEMINI构建AI应用程序

借助这些先进技术&#xff0c;您可以生成文本、分析图像并实现多模态 AI 交互。 LangChain 和 Google 的 Gemini API 是什么&#xff1f; LangChain&#xff1a;构建 AI 应用程序的弹性框架 LangChain 是一个强大且灵活的框架&#xff0c;可以简化 AI 应用程序的开发。它提供…

绝对新惊喜:4款王者级别的办公软件,免费又实用

工作里有那么多规矩&#xff0c;但效率绝对是重中之重&#xff0c;选对了好软件&#xff0c;工作就能更高效&#xff0c;下班也能更早回家。 要是你也想做个“时间管理小能手”&#xff0c;下面这4款超好用的办公软件&#xff0c;你可千万别错过&#xff01; Gitmind 现在很…

奇绩创坛 2024 年春季创业营路演

奇绩创坛 2024 年春季创业营路演 奇绩创坛在北京中关村举办的 2024 年春季创业营路演 奇绩创坛在北京中关村举办的 2024 年春季创业营路演 RWKV 元始智能的COO罗璇在会议上详细分享了RWKV的创新模型架构、最新进展以及当前的研究方向。 目前&#xff0c;RWKV架构已经推出了最…

五、LVS原理

目录 5.1 LVS 相关原理 5.1.1 LVS集群的体系结构以及特点 5.1.1.1 LVS简介 5.1.1.2 LVS体系结构 5.1.1.3 LVS相关术语 5.1.1.4 LVS工作模式 5.1.1.5 LVS调度算法 5.1.2 LVS-DR集群介绍 5.1.2.1 LVS-DR模式工作原理 5.1.2.2 LVS-DR模式应用特点 5.1.2.3 LVS-DR模式ARP抑制 5.1…

使用Transformer进行抄袭检测

动机 在许多行业中&#xff0c;尤其是在学术界&#xff0c;抄袭是一个重大问题。随着互联网和开放信息的兴起&#xff0c;这种现象甚至变得更加严重&#xff0c;任何人都可以通过点击访问特定主题的任何信息。 基于这一观察&#xff0c;研究人员一直在尝试使用不同的文本分析…