vue2实现生成二维码和复制保存图片功能(复制的同时会给图片加文字)

<template><divstyle="display: flex;justify-content: center;align-items: center;width: 100vw;height: 100vh;"><div><!-- 生成二维码按钮和输入二维码的输入框 --><input v-model="url" placeholder="输入链接" type="text" /><button @click="generateQRCode">输入网址链接生成二维码</button><hr /><!-- 生成图片主要的容器部分 --><divclass="container"style="margin-top: 20px;border: 1px solid;display: flex;flex-direction: column;align-items: center;"><div v-if="qrCode"><img :src="qrCode" alt="QR Code" /></div></div><!-- 保存图片和复制图片按钮 --><divstyle="width: 100%;display: flex;justify-content: space-around;align-items: center;height: 100px;"><button @click="saveImage">保存图片</button><button @click="copyImage">复制图片</button></div></div></div>
</template><script>
// yarn add qrcode 执行命令安装
import QRCode from "qrcode";
// yarn add html2canvas@1.0.0-rc.4 执行命令安装
import html2canvas from "html2canvas";
export default {data() {return {url: "", // 这个是输入框的值qrCode: "", // 这个是二维码图片的urlbase64Image: "", // 这个是保存图片和复制图片使用的base64图片地址};},methods: {// 将页面内容生成图片的逻辑generateimages() {// 获取容器元素const container = document.querySelector(".container");const that = this;// 使用 html2canvas 生成图片return html2canvas(container, {useCORS: true, // 开启跨域配置allowTaint: false, // 允许跨域图片scale: 2, // 按比例增加分辨率 (2=双倍).dpi: window.devicePixelRatio * 2, // 设备像素比}).then((canvass) => {// 在canvas上添加文字const title = "小米科技";const src = "链接为:" + this.url;const text = "图片复制到的内容";const canvas = document.createElement("canvas");// 设置 Canvas 元素的宽度和高度,与生成的canvas宽高一致canvas.width = canvass.width;canvas.height = canvass.height;// 获取 Canvas 的 2D 绘图上下文const ctx = canvas.getContext("2d");// 创建一个图片对象const image = new Image();image.src = canvass.toDataURL();return new Promise((resolve, reject) => {image.onload = function () {// 下面三个是定义生成的图片里面的文字的const textWidth = ctx.measureText(text).width;const titleWidth = ctx.measureText(title).width;const srcWidth = ctx.measureText(src).width;// 在 Canvas 上绘制图片(每个参数含义(图片源,横坐标,纵坐标,宽,高))ctx.drawImage(image,canvas.width / 2 - canvas.width / 4,canvas.height / 2 - canvas.height / 4,canvas.width / 2,canvas.height / 2);// 绘制其他内容ctx.fillStyle = "blue"; // 指定文字颜色ctx.font = "16px Arial"; // 指定文字字号大小(只需要改前面的数字就行)ctx.fillText(text,canvas.width / 2 - textWidth / 2,canvas.height - 30); // 将文字定位到指定位置(参数(文字,横坐标,纵坐标))ctx.fillText(title, canvas.width / 2 - titleWidth / 2, 30);ctx.fillText(src, canvas.width / 2 - srcWidth / 2, 50);// 将 Canvas 转换为 base64 图片并保存console.log("canvas.toDataURL()", canvas.toDataURL());that.base64Image = canvas.toDataURL();// 操作完成,resolve Promiseresolve("完成");};image.onerror = function (error) {// 操作失败,reject Promisereject(error);};});}).catch((error) => {console.error("生成图片出错:", error);throw error;});},generateQRCode() {// 生成二维码逻辑(参数指定url文字即可)QRCode.toDataURL(this.url).then(async (qr) => {this.qrCode = qr;// 生成完二维码重新对容器的内容进行图片的生成// 这里会有异步情况,会导致图片base64地址不对,因此这里执行了两次,如果自己跑还不够的话可以再往下补一次await this.generateimages();await this.generateimages();}).catch((error) => {console.error("生成二维码出错:", error);});},saveImage() {// 保存图片功能// 创建一个虚拟的链接元素const link = document.createElement("a");// 指定a元素href地址(指向base64图片)link.href = this.base64Image;// 下载图片的图片名后缀link.download = "image.png";// 使用点击事件模拟下载操作link.dispatchEvent(new MouseEvent("click"));},copyImage() {// 实现复制图片到剪贴板的逻辑// 创建一个Image元素并设置src为base64图片const image = new Image();image.src = this.base64Image;console.log("复制的图片为:", this.base64Image);// 等待图片加载完成image.onload = () => {// 创建一个canvas元素const canvas = document.createElement("canvas");// 获取canvas上下文对象const ctx = canvas.getContext("2d");// 设置canvas的尺寸与图片一致canvas.width = image.width;canvas.height = image.height;// 将图片绘制到canvas上ctx.drawImage(image, 0, 0, image.width, image.height);// 调用Clipboard API将canvas内容复制到剪贴板canvas.toBlob((blob) => {const item = new ClipboardItem({ "image/png": blob });navigator.clipboard.write([item]).then(() => {console.log("图片已复制到剪贴板");}).catch((err) => {console.error("复制图片失败:", err);});});};image.onerror = (err) => {console.error("图片加载失败:", err);};},},
};
</script>

效果图

在这里插入图片描述

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

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

相关文章

智能家居1 -- 实现语音模块

项目整体框架: 监听线程4&#xff1a; 1. 语音监听线程:用于监听语音指令&#xff0c; 当有语音指令过来后&#xff0c; 通过消息队列的方式给消息处理线程发送指令 2. 网络监听线程&#xff1a;用于监听网络指令&#xff0c;当有网络指令过来后&#xff0c; 通过消息队列的方…

SpringSecurity6 学习

学习介绍 网上关于SpringSecurity的教程大部分都停留在6以前的版本 但是&#xff0c;SpringSecurity6.x版本后的内容进行大量的整改&#xff0c;网上的教程已经不能够满足 最新的版本使用。这里我查看了很多教程 发现一个宝藏课程&#xff0c;并且博主也出了一个关于SpringSec…

【python】条件语句与循环语句

目录 一.条件语句 1.定义 2.条件语句格式 &#xff08;1&#xff09;if &#xff08;2&#xff09;if-else &#xff08;3&#xff09;elif功能 &#xff08;4&#xff09;if嵌套使用 3.猜拳游戏 二.循环语句 1. while循环 2.while嵌套 3.for循环 4.break和conti…

被问了n遍的小程序地理位置权限开通方法

小程序地理位置接口有什么功能&#xff1f; 在平时我们在开发小程序时&#xff0c;难免会需要用到用户的地理位置信息的功能&#xff0c;小程序开发者开放平台新规要求如果没有申请开通微信小程序地理位置接口( getLocation )&#xff0c;但是在代码中却使用到了相关接口&#…

人工智能概述与入门基础简述

人工智能&#xff08;AI&#xff09;是计算机科学的一个分支&#xff0c;它致力于创建能够执行通常需要人类智能的任务的机器。这篇科普文章将全面介绍人工智能的基本概念、发展历程、主要技术、实际应用以及如何入门这一领域。 一、人工智能的定义与发展历程 人工智能的概念…

springboot版本升级,及解决springsecurity漏洞问题

背景&#xff1a; 项目中要解决 Spring Security RegexRequestMatcher 认证绕过漏洞&#xff08;CVE-2022-22978&#xff09; 漏洞问题&#xff0c;并且需要将项目的版本整体升级到boot版本2.1.7&#xff0c;升级改造过程非常的痛苦&#xff0c;一方面对整个框架的代码不是很熟…

六淳科技IPO终止背后:十分着急上市,大额分红,实控人买豪宅

华西证券被暂停保荐业务资格6个月的影响力逐渐显现。 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;东莞六淳智能科技股份有限公司&#xff08;下称“六淳科技”&#xff09;及其保荐人撤回上市申请材料。因此&#xff0c;深圳证券交易所决定终止对其首次公开发行…

LangChain 概念篇(喂饭级)

LangChain 介绍 LangChain 是一个用于开发由语言模型驱动的应用程序的框架。 LangChain 框架的设计目标 支持应用程序让其不仅会通过 API 调用语言模型&#xff0c;而且还会数据感知&#xff08;将语言模型连接到其他数据源&#xff09;&#xff0c;Be agentic&#xff08;允…

专注 APT 攻击与防御—基于UDP发现内网存活主机

UDP简介&#xff1a; UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的协议&#xff0c;在第四层-传输层&#xff0c;处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点&#xff0c;也就是说&#xff0c;当报文发送之后&#xf…

spring高级篇(十)

1、内嵌tomcat boot框架是默认内嵌tomcat的&#xff0c;不需要手动安装和配置外部的 Servlet 容器。 简单的介绍一下tomcat服务器的构成&#xff1a; Catalina&#xff1a; Catalina 是 Tomcat 的核心组件&#xff0c;负责处理 HTTP 请求、响应以及管理 Servlet 生命周期。它包…

OpenHarmony实战开发-应用侧调用前端页面函数

应用侧可以通过runJavaScript()方法调用前端页面的JavaScript相关函数。 在下面的示例中&#xff0c;点击应用侧的“runJavaScript”按钮时&#xff0c;来触发前端页面的htmlTest()方法。 前端页面代码。 <!-- index.html --> <!DOCTYPE html> <html> <…

图片浏览器-PicView

一、前言 PicView 是一款适用于 Windows 10 或 11 的快速高效的图像查看器&#xff0c;配备了干净简洁的用户界面&#xff0c;可以在不需要时方便地隐藏。 二、支持类型 它支持广泛的图像文件类型&#xff0c;包括&#xff1a;WEBP、GIF、SVG、PNG、JXL、HEIC、PSD 三、软件特…

红日靶场ATTCK 1通关攻略

环境 拓扑图 VM1 web服务器 win7&#xff08;192.168.22.129&#xff0c;10.10.10.140&#xff09; VM2 win2003&#xff08;10.10.10.135&#xff09; VM3 DC win2008&#xff08;10.10.10.138&#xff09; 环境搭建 win7&#xff1a; 设置内网两张网卡&#xff0c;开启…

CNN笔记详解

CNN(卷积神经网络) 计算机视觉&#xff0c;当你们听到这一概念的是否好奇计算机到底是怎样知道这个图片是什么的呢&#xff1f;为此提出了卷积神经网络&#xff0c;通过卷积神经网络&#xff0c;计算机就可以识别出图片中的特征&#xff0c;从而识别出图片中的物体。看到这里充…

Python安装以及环境配置

目录 一、下载安装包二级目录三级目录 一、下载安装包 方式网址Python官网python.org镜像下载地址Download pythonpycharmDownload PyCharm https://blog.csdn.net/sun80760/article/details/135256627 二级目录 三级目录

认识ansible 了解常用模块

ansible是什么&#xff1f; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。是自动化运维工具&#xff0…

机器人操作系统ROS2学习 1

随着智能化时代的进程&#xff0c;机器人也在向着高度智能化的方向发展&#xff0c;这对应的机器人操作系统也就相应而生了。机器人操作系统ROS (Robot Operating System)的诞生为机器人系统的开发与应用带来了很大方便&#xff0c;也聚集了全球大量的应用开发人员推动ROS的发展…

hadoop学习---基于Hive的数仓搭建增量信息拉链表的实现

拉链表就是SCD2&#xff0c;它的优点是即满足了反应数据的历史状态&#xff0c;又能在最大程度上节省存储。 拉链表的实现需要在原始字段基础上增加两个新字段&#xff1a; start_time(表示该条记录的生命周期开始时间——周期快照时的状态)end_time(该条记录的生命周期结束时…

Python项目实战,用Python实现2048游戏

目录 写在前言项目介绍项目思路环境搭建项目实现初始化Python类初始化游戏窗口定义游戏棋盘和方块移动和合并游戏主循环 进一步探索 写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎…

在2G到4g小区重选过程中,4g频点没有优先级信息,最后UE无法重选到4g,是否正常?

这个确实是老问题了&#xff0c;要翻开GSM 的协议找答案。 GSM cell reselection算法分为cell ranking based和priority based两种方式。cell ranking based 只能从GSM重选到UTRAN&#xff1b;而priority based则可以重选到UTRAN和EUTRA。 根据priority based重选算法的描述&am…