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

<template>
  <div
    style="
      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 />

      <!-- 生成图片主要的容器部分 -->
      <div
        class="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>

      <!-- 保存图片和复制图片按钮 -->
      <div
        style="
          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: "", // 这个是二维码图片的url
      base64Image: "", // 这个是保存图片和复制图片使用的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 Promise
              resolve("完成");
            };

            image.onerror = function (error) {
              // 操作失败,reject Promise
              reject(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>

效果图

在这里插入图片描述

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

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

相关文章

第四篇:记忆的迷宫:探索计算机存储结构的奥秘与创新

记忆的迷宫&#xff1a;探索计算机存储结构的奥秘与创新 1 引言 1.1 计算机存储系统的发展与重要性 在现代计算技术中&#xff0c;存储系统承担着非常关键的角色&#xff0c;它不仅负责信息的持久保存&#xff0c;同时确保高效的数据访问速度&#xff0c;影响着整体系统性能的…

[redis] redis为什么快

1. Redis与Memcached的区别 两者都是非关系型内存键值数据库&#xff0c;现在公司一般都是用 Redis 来实现缓存&#xff0c;而且 Redis 自身也越来越强大了&#xff01;Redis 与 Memcached 主要有以下不同&#xff1a; (1) memcached所有的值均是简单的字符串&#xff0c;red…

electron 通信总结

默认开启上下文隔离的情况下 渲染进程调用主进程方法&#xff1a; 主进程 在 main.js 中&#xff0c; 使用 ipcMain.handle&#xff0c;添加要处理的主进程方法 const { ipcMain } require("electron"); 在 electron 中创建 preload.ts 文件&#xff0c;从 ele…

getchar和putchar函数详解

getchar和putchar函数详解 1.getchar函数1.1函数概述1.2函数返回值1.3函数注意事项1.4函数的使用 2.putchar函数2.1函数概述2.2函数返回值2.3函数使用实例 1.getchar函数 1.1函数概述 从一个流中读取一个字符&#xff0c;或者从标准输入中获得一个字符 函数原型&#xff1a; …

HFSS学习-day1-T形波导的内场分析和优化设计

入门实例--T形波导的内场分析和优化设计 HFSS--此实例详细步骤1.创建项目2.设置求解类型3.设置与建模相关的一些信息设置默认的建模长度单位 4.创建T形模型的三个臂基本参数端口激励进行复制 5.创建被挖去的部分设置正确的边界条件和端口激励方式添加求解设置添加扫频项检查一下…

基于EWT联合SVD去噪

一、代码原理 &#xff08;1&#xff09;基于EWT-SVD的信号去噪算法原理 经验小波变换&#xff08;Empirical Wavelet Transform&#xff0c;EWT&#xff09;&#xff1a;EWT是一种基于信号局部特征的小波变换方法&#xff0c;能够更好地适应非线性和非平稳信号的特性。奇异值…

寻找最佳App分发平台:小猪APP分发脱颖而出

在当今移动应用市场日益饱和的环境下&#xff0c;选择一个合适的App分发平台对于开发者来说至关重要。这不仅关系到应用能否快速触达目标用户&#xff0c;还直接影响到品牌的塑造与市场份额的争夺。本文将深入探讨几大关键因素&#xff0c;帮助开发者判断哪个App分发平台最适合…

pyside6的调色板QPalette的简单应用

使用调色板需要先导入:from PySide6.QtGui import QPalette 调色板QPalette的源代码&#xff1a; class QPalette(Shiboken.Object):class ColorGroup(enum.Enum):Active : QPalette.ColorGroup ... # 0x0Normal : QPalette.ColorGrou…

权益商城系统源码 现支持多种支付方式

简介&#xff1a; 权益商城系统源码&#xff0c;支持多种支付方式&#xff0c;后台商品管理&#xff0c;订单管理&#xff0c;串货管理&#xff0c;分站管理&#xff0c;会员列表&#xff0c;分销日志&#xff0c;应用配置。 上传到服务器&#xff0c;修改数据库信息&#xff…

裁员为什么先裁技术人员?

最近这个问题比较火&#xff0c;我分享一个印象深刻的答案&#xff1a;楼盖完了&#xff0c;还需要搬砖的吗&#xff1f; 这个答案让我对互联网/程序员这个行业/职业有了新的认识。 房地产是在现实世界里盖房子&#xff0c;互联网是在虚拟世界里盖房子&#xff0c;只不过互联网…

【CTF Web】XCTF GFSJ0485 simple_php Writeup(代码审计+GET请求+PHP弱类型漏洞)

simple_php 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 解法 &#xfeff;<?php show_source(__FILE__); include("config.php"); $a$_GET[a]; $b$_GET[b]; if($a0 and $a){echo $flag1; } if(is_numeric($b)){exit(); } if($b>1234){ech…

【氮化镓】GaN HEMTs 在金星及恶劣环境下的应用

文章是关于GaN增强模式晶体管(enhancement-mode p-GaN-gate AlGaN/GaN HEMTs)在金星探索和其它恶劣环境下的应用研究。文章由Qingyun Xie等人撰写,发表在《Applied Physics Letters》上,属于(Ultra)Wide-bandgap Semiconductors for Extreme Environment Electronics特刊。…

基于Springboot的果蔬作物疾病防治系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的果蔬作物疾病防治系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

接口性能调优

1. 如何判断性能问题 行内默认错误率超过 0.05% 是有问题的查看吞吐量 正常情况下&#xff1a;吞吐量会随着线程的增加而增长 当遇到瓶颈时&#xff0c;吞吐量会持平或者下滑 2. 如果访问一个接口的访问时间很慢&#xff0c;如何查找问题 数据库是否有问题--》缓存redis是否正…

Fireworks AI和MongoDB:依托您的数据,借助优质模型,助力您开发高速AI应用

我们欣然宣布 MongoDB与 Fireworks AI 正携手合作 让客户能够利用生成式人工智能 (AI) 更快速、更高效、更安全地开展创新活动 Fireworks AI由 Meta旗下 PyTorch团队的行业资深人士于 2022 年底创立&#xff0c;他们在团队中主要负责优化性能、提升开发者体验以及大规模运…

GoLand安装教程

GoLand-安装 GoLand是Go语言编程开发的一款工具&#xff0c;和 IntelliJ IDEA 一样&#xff0c;同为Jetbrains公司旗下的产品&#xff0c;专为Go语言开发的跨平台商业集成开发环境&#xff08;IDE&#xff09;&#xff0c;它的功能非常强大&#xff0c;它还不仅仅是一个Go IDE…

【数据结构初阶】希尔排序

鼠鼠最近学习了希尔排序&#xff0c;做个笔记&#xff01; 希尔排序也是插入排序的一种捏&#xff01;本篇博客也是用排升序来举例捏&#xff01; 希尔排序是基于直接插入排序的&#xff0c;是由大佬D.L.Shell提出的。 目录 1.希尔排序 1.1.预排序 1.2.直接插入排序 2.希…

jpg和png格式如何互相转换?这四个方法教会你!

JPG转PNG的转换是一个常见的图像处理需求&#xff0c;无论是因为PNG格式具有更好的透明度和无损压缩的特性&#xff0c;还是因为某些特定的应用场景需要这种格式。下面&#xff0c;我们将详细介绍如何将JPG转换为PNG格式&#xff0c;包括使用图像处理软件、在线转换工具、PDF转…

Redis的数据类型及使用场景

redis命令大全官网: Commands | Docs (redis.io) 基本介绍 redis起初主要就是为了解决性能问题的&#xff0c;那么redis为什么快? 基于内存操作的&#xff0c;所以操作不需要跟磁盘进行交互&#xff0c;单次的执行会很快 命令执行是单线程 因为基于内存操作 单次执行时间反…

【MicroPython ESP32】ssd1306驱动0.96“I2C屏幕汉字显示示例

所需模块micropython-ssd1306模块 中文下载站&#xff1a;https://www.cnpython.com/pypi/micropython-ssd1306/download 官方下载站&#xff1a;https://pypi.org/project/micropython-ssd1306/ 汉字取模说明 取模工具&#xff1a;pctolcd2002取模方式&#xff1a; UTF-8字…