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


    目录

    1.初始化qrcode

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

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

    3.父页面调用组件代码

    4.组件展示效果

    5.二维码下载展示效果


    1.初始化qrcode

    cnpm install --save qrcode

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

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

    1. <template>
    2. <div id="meQrcode" :title="qrText">
    3. <div class="qrcode_box">
    4. <img class="qrcode_canvas" id="qrcode_canvas" ref="qrcode_canvas" alt="二维码" />
    5. <img v-if="qrLogo" class="qrcode_logo" ref="qrcode_logo" :src="qrLogo" alt="logo" />
    6. <canvas :width="qrSize" :height="qrSize" class="canvas" ref="canvas" id="canvas"></canvas>
    7. <el-button round size="small" @click="savePic">保存图片</el-button>
    8. </div>
    9. </div>
    10. </template>
    11. <script>
    12. import QRCode from "qrcode";
    13. import logo from "./logo.jpg";
    14. export default {
    15. props: {
    16. //二维码存储内容
    17. qrUrl: {
    18. type: String,
    19. default: "你不配"
    20. },
    21. //二维码尺寸(正方形 长宽相同)
    22. qrSize: {
    23. type: Number,
    24. default: 300
    25. },
    26. //二维码底部文字
    27. qrText: {
    28. default: "美女"
    29. },
    30. //二维码中部logo 如果写default: ""则不生成logo
    31. qrLogo: {
    32. type: String,
    33. default: logo
    34. },
    35. //logo尺寸(正方形 长宽相同)
    36. qrLogoSize: {
    37. type: Number,
    38. default: 40
    39. },
    40. //底部说明文字字号
    41. qrTextSize: {
    42. type: Number,
    43. default: 14
    44. }
    45. },
    46. data() {
    47. return {};
    48. },
    49. methods: {
    50. /**
    51. * @argument qrUrl 二维码内容
    52. * @argument qrSize 二维码大小
    53. * @argument qrText 二维码中间显示文字
    54. * @argument qrTextSize 二维码中间显示文字大小(默认16px)
    55. * @argument qrLogo 二维码中间显示图片
    56. * @argument qrLogoSize 二维码中间显示图片大小(默认为80)
    57. */
    58. handleQrcodeToDataUrl() {
    59. let qrcode_canvas = this.$refs.qrcode_canvas;
    60. let qrcode_logo = this.$refs.qrcode_logo;
    61. let canvas = this.$refs.canvas;
    62. const that = this;
    63. QRCode.toDataURL(
    64. this.qrUrl,
    65. { errorCorrectionLevel: "H" },
    66. (err, url) => {
    67. qrcode_canvas.src = url;
    68. // 画二维码里的logo// 在canvas里进行拼接
    69. let ctx = canvas.getContext("2d");
    70. setTimeout(() => {
    71. //获取图片
    72. ctx.drawImage(qrcode_canvas, 0, 0, that.qrSize, that.qrSize);
    73. if (that.qrLogo) {
    74. //设置logo大小
    75. //设置获取的logo将其变为圆角以及添加白色背景
    76. ctx.fillStyle = "#fff";
    77. ctx.beginPath();
    78. let logoPosition = (that.qrSize - that.qrLogoSize) / 2; //logo相对于canvas居中定位
    79. let h = that.qrLogoSize + 10; //圆角高 10为基数(logo四周白色背景为10/2)
    80. let w = that.qrLogoSize + 10; //圆角宽
    81. let x = logoPosition - 5;
    82. let y = logoPosition - 5;
    83. let r = 5; //圆角半径
    84. ctx.moveTo(x + r, y);
    85. ctx.arcTo(x + w, y, x + w, y + h, r);
    86. ctx.arcTo(x + w, y + h, x, y + h, r);
    87. ctx.arcTo(x, y + h, x, y, r);
    88. ctx.arcTo(x, y, x + w, y, r);
    89. ctx.closePath();
    90. ctx.fill(); qrcode_logo.onload = function () {
    91. ctx.drawImage(
    92. qrcode_logo,
    93. logoPosition,
    94. logoPosition,
    95. that.qrLogoSize,
    96. that.qrLogoSize
    97. );
    98. }
    99. }
    100. if (that.qrText) {
    101. //设置字体
    102. let fpadd = 10; //规定内间距
    103. ctx.font = "bold " + that.qrTextSize + "px Arial";
    104. let tw = ctx.measureText(that.qrText).width; //文字真实宽度
    105. let ftop = that.qrSize - that.qrTextSize; //根据字体大小计算文字top
    106. let fleft = (that.qrSize - tw) / 2; //根据字体大小计算文字left
    107. let tp = that.qrTextSize / 2; //字体边距为字体大小的一半可以自己设置
    108. ctx.fillStyle = "#fff";
    109. ctx.fillRect(
    110. fleft - tp / 2,
    111. ftop - tp / 2,
    112. tw + tp,
    113. that.qrTextSize + tp
    114. );
    115. ctx.textBaseline = "top"; //设置绘制文本时的文本基线。
    116. ctx.fillStyle = "#333";
    117. ctx.fillText(that.qrText, fleft, ftop);
    118. }
    119. qrcode_canvas.src = canvas.toDataURL();
    120. }, 0);
    121. }
    122. );
    123. },
    124. //保存图片
    125. savePic() {
    126. let a = document.createElement("a")
    127. //将二维码面板处理为图片
    128. a.href = this.$refs.canvas.toDataURL("image/png", 0.5);
    129. a.download = this.qrUrl + ".png"
    130. a.click()
    131. },
    132. },
    133. mounted() {
    134. this.handleQrcodeToDataUrl();
    135. },
    136. updated() {
    137. this.handleQrcodeToDataUrl();
    138. },
    139. };
    140. </script>
    141. <style scoped>
    142. .qrcode_box,
    143. #meQrcode {
    144. display: inline-block;
    145. }
    146. .qrcode_box img {
    147. display: none;
    148. }
    149. </style>

    3.父页面调用组件代码

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

    4.组件展示效果

    5.二维码下载展示效果

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

     

     

  • 相关阅读:
    9.14|day 7| day 46| 139.单词拆分 |关于多重背包,你该了解这些!|背包问题总结篇!
    Node.js最新版黑马配套笔记
    MediaCodec_Analyze-1-create
    nginx配置详解
    LeetCode中神奇的链表操作
    基于ElasticSearch+Vue实现简易搜索
    python爬虫(4)
    Java 线程的优先级
    【Docker】Dockerfile构建镜像
    创作纪念日 && 编程练习 - 斐波那契数列
  • 原文地址:https://blog.csdn.net/qq_29384789/article/details/125408130