当前位置: 首页 > news >正文

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>

效果图

在这里插入图片描述

相关文章:

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

<template><divstyle"display: flex;justify-content: center;align-items: center;width: 100vw;height: 100vh;"><div><!-- 生成二维码按钮和输入二维码的输入框 --><input v-model"url" placeholder"输入链接" ty…...

Redis之字符串类型深入之SDS底层结构

作为一名程序员不可能不知道redis 知道redis不可能不知道redis的字符串 如果你真的熟悉redis不能不知道sds, 我们探究一下redis字符串的底层结构 sds翻译过来就是动态扩容(Simple Dynamic String)、先看一下最早版本redis的sds结构体 struct sdshdr{int len; //记录数组中…...

Cesium 3dTileset 支持 uv 和 纹理贴图

原理: 使用自定义shader实现uv自动计算 贴图效果: uv效果:...

C++可变参数模板中的省略号

看可变参数模板代码时常会遇到省略号的使用&#xff0c;这类奇特的“...”出现位置还不固定&#xff0c;容易引起困惑。C最近一直不用都快废了&#xff0c;在此想对省略号的使用做个简单归纳以提醒自己。可变参数模板以两种方式使用省略号。 在参数名称的左侧&#xff0c;表示“…...

uni-ui 使用uni-icons有些图标显示不出来,如down,up图标

问题描述 我使用的是uni创建时勾选的uni-ui模板&#xff0c;一次偶然机会发现down图标显示不出&#xff0c;left&#xff0c;right等其他图标又可以。 最后发现使用uni-icons不是最新版本导致的&#xff0c;使用模板生成的icons是1.3.5版本&#xff0c;我在插件市场找到的是2.0…...

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…...

Java-(乘法表之后)增强for循环

这里我们先做个了解&#xff0c;之后我会在数组中进行详细介绍Java5引入了一种主要用于数组或集合的增强型for循环Java增强型for循环语法格式如下 For(声明语句&#xff1a;表达式&#xff09;{ //代码语句 } 声明语句&#xff1a;声明新的局部变量&#xff0c;该变量的类型…...

Celery(分布式任务队列)入门学习笔记

Celery 的简单介绍 用 Celery 官方的介绍&#xff1a;它是一个分布式任务队列; 简单&#xff0c;灵活&#xff0c;可靠的处理大量消息的分布式系统; 它专注于实时处理&#xff0c;并支持任务调度。 Celery 如果使用 RabbitMQ 作为消息系统的话&#xff0c;整个应用体系就是下…...

【网络】tcp协议如何保证可靠性

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输层协议&#xff0c;为网络通信提供了可靠性和连接稳定性。本文将详细介绍 TCP 协议如何保证数据的可靠传输和连接的稳定性&#xff0c;并分析其优缺点。 可靠性保证 序号和确认机制&…...

select,poll,epoll

在 Linux Socket 服务器短编程时&#xff0c;为了处理大量客户的连接请求&#xff0c;需要使用非阻塞I/O和复用&#xff0c;select&#xff0c;poll 和 epoll 是 Linux API 提供的I/O复用方式。 \selectpollepoll操作方式遍历遍历回调底层实现数组链表哈希表IO效率每次调用都进…...

【48天笔试强训】day18

题目1 描述 有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例子&#xff1a;假设一只兔子第3个月出生&#xff0c;那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子&#xff0c;假如兔子都…...

链表经典面试题01

目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…...

基于java的CRM客户关系管理系统的设计与实现(论文 + 源码 )

【免费】基于Java的CRM客户关系管理系统的设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273409 基于Java的CRM客户关系管理系统的设计与实现 摘 要 随着互联网的高速发展&#xff0c;市场经济的信息化&#xff0c;让企业之间的竞争变得&#xff0…...

【动态规划-最长上升子序列模型part2】:拦截导弹、导弹防御系统、最长公共上升子序列【已更新完成】

1、拦截导弹 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 某天&#xff0c;雷达捕捉到敌国的导弹来袭。 由于…...

Spring 如何解决 Bean 循环依赖

循环依赖解释 bean A 属性注入时依赖bean B &#xff0c;并且bean B属性注入时也依赖bean A &#xff0c;造成 bean A 和bean B 都无法完成初始化问题&#xff0c;形成了闭环。 注意 项目中存在Bean的循环依赖&#xff0c;是Bean对象职责划分不明确、代码质量不高的表现&#…...

【driver4】锁,错误码,休眠唤醒,中断,虚拟内存,tasklet

文章目录 1.互斥锁和自旋锁选择&#xff1a;自旋锁&#xff08;开销少&#xff09;的自旋时间和被锁住的代码执行时间成正比关系2.linux错误码&#xff1a;64位系统内核空间最后一页地址为0xfffffffffffff000~0xffffffffffffffff&#xff0c;这段地址是被保留的&#xff0c;如果…...

python之 函数相关知识解析

01 函数的注释与嵌套 1.函数的注释 函数的注释与普通注释的区别&#xff1a;用来说明当前函数的参数含义 param 参数名: 参数的注释信息 return: 函数的返回值 例如&#xff1a; def fun1(name):""":param name: 参数的注释信息:return: 函数的返回值"…...

监视器和显示器的区别,普通硬盘和监控硬盘的区别

监视器与显示器的区别&#xff0c;你真的知道吗&#xff1f; 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要环节&#xff0c;显示系统的优劣将直接影响视频监控系统的用户体验满意度。 中小型视频监控系统中&#xff0c;显示系统是最能展现效果的一个重要…...

Linux:升级OpenSSL和OpenSSH

原因是现有版本存在安全漏洞&#xff0c;需要升级到新版本 原有版本和升级后的版本 OpenSSL 1.0.2k-fips 26 Jan 2017 -> OpenSSL 1.1.1w 11 Sep 2023OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 -> OpenSSH_9.5p1, OpenSSL 1.1.1w 11 Sep 2023目录 查看现有版…...

方法的入栈和出栈

一.作用域问题 1.全局作用域 在全局都能进行访问的变量 var a 10;function fn() {var b 20;return a b;}console.log(fn()); 2.局部的作用域 只能在限定的范围内进行访问 function fn() {var b 20;}console.log(b); b is not defined 打印的结果是b这个变量没用定义 3…...

PHP介绍

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;PHP❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、PHP是什么&#xff1f; 二、 PHP 文件是什么&#xff1f; 三、PHP能做什么&#xff1f; 四、P…...

接口自动化测试之-requests模块详解

一、requests背景 Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池&#xff0c;支持使用cookie保持会话&#xff0c;支持文件上传&#xff0c;支持自动确定响应内容的编码&#xff0c;支持国际化的 URL 和 POST 数据自动编码。 二、requests安装 利用p…...

低代码+定制物资管理:创新解决方案探析

引言 在当今快速变化的商业环境中&#xff0c;企业面临着不断增长的挑战&#xff0c;如提高效率、降低成本、满足客户需求等。为了应对这些挑战&#xff0c;企业需要不断创新并采用先进的技术解决方案。在这样的背景下&#xff0c;低代码开发和定制化物资管理成为了引领企业变…...

13 【PS作图】人物绘画理论-脸型

三庭五眼 三庭&#xff1a;脸的长度比例 &#xff08;1&#xff09;发际线到眉毛 &#xff08;2&#xff09;眉毛到鼻底 &#xff08;3&#xff09;鼻底到下巴 三个部分大致为三等分 五眼&#xff1a;脸的宽度比例 以眼睛长度为单位&#xff0c;把脸的宽度分成五等分&#x…...

Python批量修改图片文件名中的指定名称

批量处理图像时&#xff0c;图片名有时需要统一&#xff0c;本教程仅针对图片中名如&#xff1a;0001x4.png&#xff0c;批量将图片名中的x4去除&#xff0c;只留下0001.png的情况。 如果想要按照原图片顺序批量修改图片名&#xff0c;参考其它博文&#xff1a;按照原顺序批量…...

STM32点灯大师(点了一颗LED灯,轮询法)

配置操作&#xff1a; 一、使用CubeMX配置到大致的操作 1.1 选择芯片 1.2 选择引脚&#xff08;根据电路图&#xff09; 1.3 配置gpio口 1.4 配置系统 1.5文件项目操作 最后就是点击 二、点击CubeMX生成的代码&#xff0c;并且修改代码 2.1 看看效果 2.2 写代码...

动态规划算法:路径问题

例题一 解法&#xff08;动态规划&#xff09;&#xff1a; 算法思路&#xff1a; 1. 状态表⽰&#xff1a; 对于这种「路径类」的问题&#xff0c;我们的状态表⽰⼀般有两种形式&#xff1a; i. 从 [i, j] 位置出发&#xff0c;巴拉巴拉&#xff1b; ii. 从起始位置出…...

盘一盘接口测试的那些痛点,你现在会解决了吗

前言 说到接口测试&#xff0c;想必大家一定不会陌生。接口测试就是测试系统组件间&#xff0c;接口对接是否顺畅的一种测试。包括测试数据能否交换、能否传递、能否正常控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系&#xff0c;等等。 由于接口测试主要是检测系统…...

基于alpha shapes的边缘点提取(matlab)

1、原理介绍 由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。其克服了点云边界点形状影响的缺点&#xff0c;可快速准确提取边界点。如下图所示&#xff0c;对于任意形状的平面点云&#xff0c;若一个半径为a的圆&#xff0c;绕其进行滚动&…...

C#三人飞行棋

C#三人飞行棋 #region 1控制台设置int w 50, h 30; ConsoleInit(w, h); #endregion#region 2 场景选择实例//声明一个表示场景标识的变量 E_SceneType nowSceneType new E_SceneType(); while (true) {switch (nowSceneType){case E_SceneType.Begion://开始场景逻辑Consol…...

吴桥做网站价格/舆情网站

将新插入磁盘的Frimware state修改为unconfig good 找到unconfig bad的磁盘 # ./MegaCli64 -pdlist -a0 Adapter #0 Enclosure Device ID: 252 Slot Number: 0 Drives position: DiskGroup: 0, Span: 0, Arm: 0 Enclosure position: N/A Device Id: 2 WWN: 5000C50098BAA7…...

软件开发分为哪几个步骤/深圳seo网络优化公司

ID:9440569分类&#xff1a;湖南,2018资源大小&#xff1a;7185KB资料简介:2018年仁爱英语八年级下册英语期末测试(时间:90分钟 总分:100分)姓名:_________________ 班次:_________________I、听力技能(共一个部分,15小题,计15分)对话理解。根据你听到的对话,从A、B、C中选择正…...

在局域网内访问本机的asp网站/东莞网站推广排名

class type type()函数既可以返回一个对象的类型&#xff0c;又可以创建出新的类型,原型为&#xff1a; type(object) -> the objects type type(name, bases, dict) -> a new type 要创建一个class对象&#xff0c;type()函数依次传入3个参数&#xff1a; class的名…...

利为汇网站建设/今日世界杯比分预测最新

题目如下 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 变位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 变位词 指字母相同&#xff0c;但排列不同的字符串。 解题思路 思想&#xff1a; 1.数组滑动窗口长度为p串的长度&#xff0c;在s…...

天成信息网站建设自助建站平台/外贸获客软件

http://blog.csdn.net/vblittleboy/article/details/8982857 x264是一个 H.264/MPEG4 AVC 编码器&#xff0c;本指南将指导新手如何创建高质量的H.264视频。 对于普通用户通常有两种码率控制模式&#xff1a;crf&#xff08;Constant Rate Factor)和Two pass ABR。码率控制是一…...

帝国cms网站地址/福建seo学校

官方文档地址&#xff1a;Flask-Resuful 官方文档 经常见到的Restful内容如下&#xff1a; HTTP 方法 行为 示例GET 获取资源的信息 http://example.com/api/orders GET 获取某个特定资源的信息 http://example.com/api/orders…...