vue3:使用:图片生成二维码并复制

本文介绍了如何在Vue3项目中使用qrcodejs2-fix生成二维码,并实现复制功能。特别提到在HTTPS环境下需要添加安全证书才能使用navigator.clipboard.write方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现在 vue3 中根据 url 生成一个二维码码,且可以复制。

注)复制功能 navigator.clipboard.write 只能在安全的localhost 这种安全网络下使用。https中需要添加安全证书,且在域名(例:https://www.baidu.com)这种下即可。

1、安装

注)由于qrcodejs的兼容性问题,需要在vue3中引入qrcodejs2-fix才能正常生成二维码。

npm install qrcodejs2-fix

2、在vue文件中导入模块qrcodejs2-fix

import QRCode from 'qrcodejs2-fix';

3、场景一、生成二维码码、复制(生成的二维码图片)

<template>
    // 点南生成二维码
    <e-button type="primary" @click="handleGenerate">点击生成二维码</e-button>
    // 生成的二维码图片
    <div id="imgCode"></div>
    // 复制二维码
    <e-button type="primary" @click="handleCopyCode">复制</e-button>
</template>

<script setup>
// 1、生成二维码(id名称, 参数)
function handleGenerate(idName, name) {
    // 采集二维码:路径
    const ip = 'https://crm.waihucc.com';
    const getIPAddress = `${ip}/h5/index.html`; 
    const url = `${getIPAddress}?companyId=80&saleId=${name}`;
    // 获取二维码码 div 上的 id
    const qrCodeElement = document.getElementById(idName);
    if (qrCodeElement) {
        qrCodeElement.innerHTML = '';
        new QRCode(qrCodeElement, {
            text: url || '',
            width: 100, // 二维码宽度
            height: 100, // 二维码高度
        });
    }
}

// 2、复制生成的二维码(id 名称)
function handleCopyCode(idName) {
    // 1、获取图片元素
    const imgElement = document.querySelector(`#${idName} img`);
    // 2、创建一个新的Image对象
    const img = new Image();
    // 3、设置Image对象的src为图片元素的src
    img.src = imgElement.src;
    // 4、监听图片加载完成事件
    img.onload = function () {
        //(1)创建 Canvas
        const canvas = document.createElement('canvas');
        canvas.width = img.width;
        canvas.height = img.height;
        const ctx = canvas.getContext('2d');
        //(2)在Canvas上绘制图片
        ctx.drawImage(img, 0, 0);
        //(3)获取 Canvas 内容作为Blob
        canvas.toBlob(function (blob) {
            //(4)使用Clipboard API 把生成对象URL,写入到剪贴板
            navigator.clipboard
                .write([new ClipboardItem({ 'image/png': blob })])
                .then(() => {
                    ElMessage({
                        message: '二维码已复制',
                        type: 'success',
                    });
                })
                .catch(() => {
                    console.error('图像复制失败');
                });
        });
    };
}
</script>

 4、场景二、点"复制"按钮,生成二维码,点击"复制"直接复制生成的二维码图片

<template>
    // 复制二维码
    <e-button type="primary" @click="generateCode">复制</e-button>
    // 生成的二维码图片
    <div id="imgCode"></div>
</template>

<script setup>
// 1、
const generateCode = (url, idName) => {
    document.getElementById(idName).innerHTML = '';
    new QRCode(document.getElementById(idName), {
        text: url || '',
    });

    // 获取 Canvas 元素
    const canvas = document.getElementById(idName).querySelector('canvas');
    // 将 Canvas 转换为 Data URL
    const dataURL = canvas.toDataURL();
    // 创建一个 Blob 对象
    const blob = dataURLToBlob(dataURL);
    // 使用 Clipboard API 复制 Blob 对象到剪贴板
    navigator.clipboard
        .write([new ClipboardItem({ 'image/png': blob })])
        .then(() => {
            ElMessage({
                message: '二维码已复制',
                type: 'success',
            });
        })
        .catch(() => {
            console.error('图像复制失败');
        });
};

// 2、
const dataURLToBlob = (dataURL) => {
    const arr = dataURL.split(',');
    const mime = arr[0].match(/:(.*?);/)[1];
    const bstr = atob(arr[1]);
    let n = bstr.length;
    const u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], { type: mime });
};
</script>

### 如何通过编程实现图片二维码 要将一张普通的图像转换成二维码,通常需要借助专门的库来完成这一过程。以下是关于如何利用 Python 编程语言以及相关库实现此功能的具体方法。 #### 使用 `qrcode` 和 `Pillow` 库生成二维码 Python 中有一个非常流行的库叫做 `qrcode`,它可以用来创建标准的二维码。为了进一步增强其功能支持嵌入图片作为背景或标志,可以结合另一个强大的图像处理库——`Pillow` 来操作图像数据[^2]。 下面是一个简单的例子展示如何使用这两个库把自定义图片加入到二维码中心位置: ```python import qrcode from PIL import Image, ImageDraw def create_qr_with_image(data, image_path, output_path): qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=10, border=4, ) qr.add_data(data) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white").convert(&#39;RGB&#39;) icon = Image.open(image_path) img_w, img_h = img.size factor = 4 size_w = int(img_w / factor) size_h = int(img_h / factor) icon_w, icon_h = icon.size if icon_w > size_w or icon_h > size_h: icon = icon.resize((size_w, size_h), Image.ANTIALIAS) w = int((img_w - icon_w) / 2) h = int((img_h - icon_h) / 2) icon = icon.convert("RGBA") img.paste(icon, (w, h), mask=icon.split()[3]) draw = ImageDraw.Draw(img) draw.rectangle([(w, h), (w+icon_w, h+icon_h)], outline=(0, 0, 0)) img.save(output_path) create_qr_with_image("https://www.example.com", "logo.png", "output_qr_code.png") ``` 上述脚本会读取指定路径下的 PNG 文件 (`logo.png`) 将其放置于最终生成 QR Code 的中央区域[^3]。 #### 关键技术点解析 - **QR码版本控制**: 可调整参数中的 `version` 值来自适应不同大小的信息量需求。 - **错误纠正级别设置**: 设置较高的纠错等级能够允许一定程度上的损坏仍可被识别解读。 - **颜色定制化选项**: 改变默认黑白配色方案为更吸引人的视觉效果。 此外还有其他第三方工具和服务也提供了类似的 API 接口用于在线制作复杂样式化的二维条形码图案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值