IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue生成带图片logo以及文字的二维码组件,可下载二维码为图片,附组件调用代码--核心qrcode -> 正文阅读

[JavaScript知识库]Vue生成带图片logo以及文字的二维码组件,可下载二维码为图片,附组件调用代码--核心qrcode

目录

1.初始化qrcode

2.二维码生成以及下载组件代码

可以自己控制是否生成logo以及文字说明

3.父页面调用组件代码

4.组件展示效果

5.二维码下载展示效果


1.初始化qrcode

cnpm install --save qrcode

2.二维码生成以及下载组件代码

可以自己控制是否生成logo以及文字说明

<template>
    <div id="meQrcode" :title="qrText">
        <div class="qrcode_box">
            <img class="qrcode_canvas" id="qrcode_canvas" ref="qrcode_canvas" alt="二维码" />
            <img v-if="qrLogo" class="qrcode_logo" ref="qrcode_logo" :src="qrLogo" alt="logo" />
            <canvas :width="qrSize" :height="qrSize" class="canvas" ref="canvas" id="canvas"></canvas>
            <el-button round size="small" @click="savePic">保存图片</el-button>
        </div>
    </div>
</template>
<script>
    import QRCode from "qrcode";
    import logo from "./logo.jpg";
    export default {
        props: {
            //二维码存储内容
            qrUrl: {
                type: String,
                default: "你不配"
            },
            //二维码尺寸(正方形 长宽相同)
            qrSize: {
                type: Number,
                default: 300
            },
            //二维码底部文字
            qrText: {
                default: "美女"
            },
            //二维码中部logo 如果写default: ""则不生成logo
            qrLogo: {
                type: String,
                default: logo
            },
            //logo尺寸(正方形 长宽相同)
            qrLogoSize: {
                type: Number,
                default: 40
            },
            //底部说明文字字号
            qrTextSize: {
                type: Number,
                default: 14
            }
        },
        data() {
            return {};
        },
        methods: {
            /**
              * @argument qrUrl        二维码内容
              * @argument qrSize       二维码大小
              * @argument qrText       二维码中间显示文字
              * @argument qrTextSize   二维码中间显示文字大小(默认16px)
              * @argument qrLogo       二维码中间显示图片
              * @argument qrLogoSize   二维码中间显示图片大小(默认为80)
              */
            handleQrcodeToDataUrl() {
                let qrcode_canvas = this.$refs.qrcode_canvas;
                let qrcode_logo = this.$refs.qrcode_logo;
                let canvas = this.$refs.canvas;
                const that = this;
                QRCode.toDataURL(
                    this.qrUrl,
                    { errorCorrectionLevel: "H" },
                    (err, url) => {
                        qrcode_canvas.src = url;
                        // 画二维码里的logo// 在canvas里进行拼接
                        let ctx = canvas.getContext("2d");

                        setTimeout(() => {
                            //获取图片
                            ctx.drawImage(qrcode_canvas, 0, 0, that.qrSize, that.qrSize);
                            if (that.qrLogo) {
                                //设置logo大小
                                //设置获取的logo将其变为圆角以及添加白色背景
                                ctx.fillStyle = "#fff";
                                ctx.beginPath();
                                let logoPosition = (that.qrSize - that.qrLogoSize) / 2; //logo相对于canvas居中定位
                                let h = that.qrLogoSize + 10; //圆角高 10为基数(logo四周白色背景为10/2)
                                let w = that.qrLogoSize + 10; //圆角宽
                                let x = logoPosition - 5;
                                let y = logoPosition - 5;
                                let r = 5; //圆角半径
                                ctx.moveTo(x + r, y);
                                ctx.arcTo(x + w, y, x + w, y + h, r);
                                ctx.arcTo(x + w, y + h, x, y + h, r);
                                ctx.arcTo(x, y + h, x, y, r);
                                ctx.arcTo(x, y, x + w, y, r);
                                ctx.closePath();
                                ctx.fill(); qrcode_logo.onload = function () {
                                    ctx.drawImage(
                                        qrcode_logo,
                                        logoPosition,
                                        logoPosition,
                                        that.qrLogoSize,
                                        that.qrLogoSize
                                    );
                                }
                            }
                            if (that.qrText) {
                                //设置字体
                                let fpadd = 10; //规定内间距
                                ctx.font = "bold " + that.qrTextSize + "px Arial";
                                let tw = ctx.measureText(that.qrText).width; //文字真实宽度
                                let ftop = that.qrSize - that.qrTextSize; //根据字体大小计算文字top
                                let fleft = (that.qrSize - tw) / 2; //根据字体大小计算文字left
                                let tp = that.qrTextSize / 2; //字体边距为字体大小的一半可以自己设置
                                ctx.fillStyle = "#fff";
                                ctx.fillRect(
                                    fleft - tp / 2,
                                    ftop - tp / 2,
                                    tw + tp,
                                    that.qrTextSize + tp
                                );
                                ctx.textBaseline = "top"; //设置绘制文本时的文本基线。
                                ctx.fillStyle = "#333";
                                ctx.fillText(that.qrText, fleft, ftop);
                            }
                            qrcode_canvas.src = canvas.toDataURL();
                        }, 0);
                    }
                );

            },
            //保存图片
            savePic() {
                let a = document.createElement("a")
                //将二维码面板处理为图片
                a.href = this.$refs.canvas.toDataURL("image/png", 0.5);
                a.download = this.qrUrl + ".png"
                a.click()
            },
        },
        mounted() {
            this.handleQrcodeToDataUrl();
        },
        updated() {
            this.handleQrcodeToDataUrl();
        },
    };
</script>
<style scoped>
    .qrcode_box,
    #meQrcode {
        display: inline-block;
    }

    .qrcode_box img {
        display: none;
    }
</style>

3.父页面调用组件代码

//引入组件
import QrItem from '@/components/qrcode/qrcode.vue'
//组件声明
components: {
    QrItem
},
//代码应用
<qr-item :qrText="codeText" :qrUrl="codeText" :qrSize="200"></qr-item>
//qrText  qrUrl qrSize均为组件的参数,还有一些参数没有传,则使用组件默认值,自行传递即可,
//codeText是本页的变量

4.组件展示效果

5.二维码下载展示效果

下载对于没有logo或文字的情况下也是可以的【亲测】

?

?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-29 18:55:53  更:2022-06-29 18:57:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/11 9:49:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码