vue 自定义生成二维码(含边框,中心logo)

1.需求图

image.png

2.需求描述

  • 自定义生成二维码图片
  • 二维码中心包含logo
  • 二维码顶部与底部包含产品标题,底部描述
  • 支持图片下载

3. 处理方案

  • 使用 vue-qr 组件先生成含中心图的二维码图片(此组件功能较多但不满足需求)
  • 将顶部与底部的文字或图片,切为背景轮廓图
  • 将二维码图片与背景轮廓图通过canvas重叠绘制在一起
  • 将canvas通过blob数据格式导出为png、jpg

4.示例代码

<template>
    <div>
        <vue-qr
      id="vueQrs"
      style="display: none"
      :logoSrc="config.imagePath"
      :logoScale="0.2"
      :text="config1.value"
      :size="640"
      :margin="0"
    ></vue-qr>
    <canvas ref="canvas" id="mycanvas" style="display: none"></canvas>
    </div>
</template>
<script>
import VueQr from 'vue-qr'
export default {
  components: {
    VueQr,
  },
  data() {
    return {
      config: {
        value: '123456', //显示的值、跳转的地址等信息
        imagePath: require('../../assets/img/qrIcon.jpg'), //中间logo的地址,require必要
      },
  },
mounted() {
     // 在其他页面渲染完成后,再渲染加载二维码图片(因为是基于vue-qr组件二次渲染,所以应先保证初始二维码图片先渲染出来)
    this.$next(() => {
      this.initDownLoadCode()
    })
  },
   methods: {
  // 初始化下载图片
    initDownLoadCode() {
      // 获取 Canvas 元素
      // const canvas = this.$refs.canvas  // 此处不能用ref获取dom元素,会导致canvas无法正常渲染

      const canvas = document.getElementById('mycanvas')
      const ctx = canvas.getContext('2d')
      ctx.clearRect(0, 0, canvas.width, canvas.height)
      let imgBox = document.getElementById('vueQrs')
      let img = imgBox.src
      // 创建两个 Image 对象
      const image1 = new Image()
      const image2 = new Image()
      image1.src = this.img2 // 替换为你的第一张图片路径
      // 加载第一张图片
      image1.onload = () => {
    
        // 调整canvas清晰度
        var dpr =
          window.devicePixelRatio ||
          window.webkitDevicePixelRatio ||
          window.mozDevicePixelRatio ||
          1
        canvas.width = image1.width * dpr
        canvas.height = image1.height * dpr
        canvas.style.width = image1.width + 'px'
        canvas.style.height = image1.width + 'px'
        ctx.scale(dpr, dpr)

        // 在 canvas 上绘制第一张图片
        ctx.drawImage(image1, 0, -20, canvas.width, canvas.height)

        // 加载第二张图片
        image2.src = img // 替换为你的第二张图片路径
        image2.onload = () => {
          // 在 canvas 上绘制第二张图片
          // 将第二张图片放置在第一张图片上方
          const x = (canvas.width - image2.width) / 2
          const y = (canvas.height - image2.height) / 2
          ctx.drawImage(image2, x, y, image2.width, image2.height)
        }
      }
    },
}
}
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容