vue 画二维码及长按保存

需求

想要做如下图的二维码带文字,且能够长按保存
在这里插入图片描述

前期准备

  1. 一个canvas
  2. 安装qrcode(命令:npm i qrcode)

画二维码及文字

初始化画布

<template>
    <div>
		<canvas ref="canvas" width="300" height="400"></canvas>
    </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
const canvas = ref(null);
onMounted(() => {
	// 初始化画布
    let ctx = canvas.value.getContext('2d');
})
</script>

画文字

<template>
    <div>
		<canvas ref="canvas" width="300" height="400"></canvas>
    </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
const canvas = ref(null);
onMounted(() => {
	// 初始化画布
    let ctx = canvas.value.getContext('2d');
    // 填充白色
    ctx.fillStyle = "#fff";
    ctx.fillRect(0, 0, 300, 400);
    // 画文字
    ctx.font = "14px Microsoft YaHei"
    ctx.textBaseline = "middle";
    ctx.textAlign = "center";
    ctx.fillStyle = "#333333";
    ctx.fillText("简单教程,简单编程", canvas.value.width / 2, 40);
})
</script>

画二维码

二维码需要使用qrcode转换

<template>
    <div>
		<canvas ref="canvas" width="300" height="400"></canvas>
    </div>
</template>

<script setup>
import QRCode from 'qrcode';
import { ref, onMounted } from 'vue';
const canvas = ref(null);
onMounted(() => {
	// 初始化画布
    let ctx = canvas.value.getContext('2d');
    // 填充白色
    ctx.fillStyle = "#fff";
    ctx.fillRect(0, 0, 300, 400);
    // 画文字
    ctx.font = "14px Microsoft YaHei"
    ctx.textBaseline = "middle";
    ctx.textAlign = "center";
    ctx.fillStyle = "#333333";
    ctx.fillText("简单教程,简单编程", canvas.value.width / 2, 40);
    // 画二维码
    QRCode.toDataURL('I am a pony!', function (err, url) {
        let img = new Image()
        img.src = url;
        img.onload = function () {
            ctx.drawImage(img, 50, 50, 200, 200);
        }
    })
})
</script>

长按保存

通过监听触摸事件的时间判定长按

<template>
    <div>
        <div class="friend" @touchstart="gtouchstart()" @touchmove="gtouchmove()" @touchend="showDeleteButton()">
            <canvas ref="canvas" width="300" height="400"></canvas>
        </div>
    </div>
</template>

<script setup>
import QRCode from 'qrcode';
import { ref, onMounted } from 'vue';
const canvas = ref(null);
onMounted(() => {
    let ctx = canvas.value.getContext('2d');
    // 填充白色
    ctx.fillStyle = "#fff";
    ctx.fillRect(0, 0, 300, 400);
    // 画文字
    ctx.font = "14px Microsoft YaHei"
    ctx.textBaseline = "middle";
    ctx.textAlign = "center";
    ctx.fillStyle = "#333333";
    ctx.fillText("简单教程,简单编程", canvas.value.width / 2, 40);
    // 画二维码
    QRCode.toDataURL('I am a pony!', function (err, url) {
        let img = new Image()
        img.src = url;
        img.onload = function () {
            ctx.drawImage(img, 50, 50, 200, 200);
        }
    })
})
let timeOutEvent = null //定时器 
//长按事件设置定时器
let gtouchstart = () => {
    timeOutEvent = setTimeout(() => {
        longPress()
    }, 700)
}

//手释放,如果在200毫秒内就释放,则取消长按事件,此时可以执行onclick应该执行的事件
let showDeleteButton = () => {
    clearTimeout(timeOutEvent); //清除定时器
    if (timeOutEvent != 0) {
        timeOutEvent = 0;
    }
    return false;
}
//如果手指有移动,则取消所有事件,此时说明用户只是要移动而不是长按
let gtouchmove = () => {
    clearTimeout(timeOutEvent); //清除定时器
    timeOutEvent = 0
}
//真正长按后应该执行的内容
let longPress = () => {
    timeOutEvent = 0;
    // 创建一个链接元素
    const link = document.createElement("a");
    // 将Canvas转换为数据URL
    const dataURL = canvas.value.toDataURL();

    // 设置链接的href属性为数据URL
    link.href = dataURL;

    // 设置链接的下载属性和文件名
    link.download = "canvas_image.png";

    // 模拟点击链接进行下载
    link.click();
}
</script>

<style scoped></style>

相关推荐

  1. uniapp——识别

    2024-07-10 13:14:01       40 阅读
  2. 前端自动生成识别跳转 Vue

    2024-07-10 13:14:01       50 阅读
  3. uniapp图片识别

    2024-07-10 13:14:01       65 阅读
  4. uniapp小程序——识别

    2024-07-10 13:14:01       36 阅读
  5. 前端vue2生成并可保存

    2024-07-10 13:14:01       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 13:14:01       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 13:14:01       107 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 13:14:01       90 阅读
  4. Python语言-面向对象

    2024-07-10 13:14:01       98 阅读

热门阅读

  1. 秒验 iOS端如何修改授权页背景

    2024-07-10 13:14:01       29 阅读
  2. 探索HTML5的设计原则:引领Web开发的未来方向

    2024-07-10 13:14:01       23 阅读
  3. hive 调优

    2024-07-10 13:14:01       24 阅读
  4. 精通C#编程需要学习哪些常用框架?

    2024-07-10 13:14:01       27 阅读
  5. Redis高可用解决方案哨兵模式与集群模式的比较

    2024-07-10 13:14:01       28 阅读
  6. C#实用的工具类库

    2024-07-10 13:14:01       30 阅读
  7. 4085行代码还原2D我的世界(上)

    2024-07-10 13:14:01       21 阅读
  8. 大数据面试题之GreenPlum(1)

    2024-07-10 13:14:01       21 阅读
  9. 量化机器人能否识别市场机会?

    2024-07-10 13:14:01       25 阅读
  10. 探讨SpringMVC的工作原理

    2024-07-10 13:14:01       25 阅读