vue2生成二维码海报,支持复制,下载

在pc端生成如图所示二维码海报,且支持复制,下载二维码功能 安装好QRCode 和 html2canvas后

<template> 复制代码
>  <div style="padding: 20px">
    <!-- 海报html元素 -->
    <div
      id="posterHtml"
      class="posterBox"
      :style="{backgroundImage: 'url(' + bgImgURL + ')' }"
    >
      <div class="posterContent">
        {{ contentData }}
      </div>
      <!-- 二维码 -->
      <div class="qrcodeBox">
        <div id="qrcodeImg"></div>
      </div>
    </div>
    <div>
      <button
        class="myButton"
        @click="createPoster"
      >生成海报</button>
      <button
        class="myButton"
        @click="downloadPoster(posterImgURL,'海报名称')"
      >下载海报</button>
    </div>
    <!--微信里,可长按保存或转发-->
    <!-- <img
      v-if="posterImgURL"
      class="posterBox"
      :src="posterImgURL"
    > -->
  </div>
</template>
<script>
import bgImgURL from '@/assets/images/common/codeBg.png'
import QRCode from 'qrcodejs2'
import html2canvas from 'html2canvas'

export default {
  data() {
    return {
      bgImgURL: bgImgURL,
      contentData: '我是一张分享海报', // 文案内容
      posterImgURL: '' // 最终生成的海报图片URL
    }
  },
  mounted() {
    this.$nextTick(
      () => {
        this.createQrcode('https://www.baidu.com/')
      }
    )
  },
  methods: {
    // 生成二维码
    createQrcode(text) {
      const qrcodeImgEl = document.getElementById('qrcodeImg')
      qrcodeImgEl.innerHTML = ''
      const qrcode = new QRCode(qrcodeImgEl, {
        width: 100,
        height: 100,
        colorDark: '#000000',
        colorLight: '#ffffff',
        correctLevel: QRCode.CorrectLevel.H
      })
      qrcode.makeCode(text)
    },
    // 生成海报
    createPoster() {
      const that = this
      const posterDOM = document.getElementById('posterHtml')
      html2canvas(posterDOM, {
        width: posterDOM.offsetWidth,
        height: posterDOM.offsetHeight,
        // 按比例增加分辨率
        scale: window.devicePixelRatio, // 设备像素比
        useCORS: true, // (图片跨域相关)
        allowTaint: true, // 允许跨域(图片跨域相关)
        logging: false,
        letterRendering: true
      }).then(function (canvas) {
        that.posterImgURL = canvas.toDataURL('image/png')
        that.copyImg()
      })
    },
    copyImg() {
      const parsedBase64 = this.parseBase64(this.posterImgURL)
      const type = parsedBase64.type
      // 将base64转为Blob类型
      const bytes = atob(parsedBase64.data)
      const ab = new ArrayBuffer(bytes.length)
      const ua = new Uint8Array(ab)
      for (let i = 0; i < bytes.length; i++) {
        ua[i] = bytes.charCodeAt(i)
      }
      const blob = new Blob([ab], { type })
      navigator.clipboard.write([new ClipboardItem({ [type]: blob })])
      this.$message.success('复制成功')
    },
    parseBase64(base64) {
      const re = new RegExp('data:(?<type>.*?);base64,(?<data>.*)')
      const res = re.exec(base64)
      if (res) {
        return {
          type: res.groups.type,
          ext: res.groups.type.split('/').slice(-1)[0],
          data: res.groups.data
        }
      }
    },
    // 下载海报
    downloadPoster(url, fileName) {
      const a = document.createElement('a')
      a.download = fileName
      a.href = url
      a.dispatchEvent(new MouseEvent('click'))
    }
  }
}
</script>
<style scoped>
/*海报*/
.posterBox {
  position: relative;
  width: 800px;
  height: 300px;
  background-repeat: no-repeat;
  background-size: cover;
}

/*海报文案*/
.posterContent {
  text-align: center;
  color: white;
  padding: 10px;
}

/*二维码*/
.qrcodeBox {
  position: absolute;
  bottom: 10px;
  right: 10px;
}

/*按钮*/
.myButton {
  background: none;
  cursor: pointer;
  padding: 5px 10px;
  border-radius: 4px;
  margin: 10px;
}
</style>
相关推荐
谢尔登3 分钟前
【React】 状态管理方案
前端·react.js·前端框架
用户21366100357222 分钟前
Vue商品详情与放大镜组件
前端·javascript
半个落月26 分钟前
从Tapas小Demo理清localStorage、事件与this
前端·javascript
李明卫杭州27 分钟前
Vue2 中 v-model 处理不同数据结构的技巧
前端·javascript·vue.js
李明卫杭州32 分钟前
使用 computed 处理 v-model 复杂数据结构
前端·javascript·vue.js
丨我是张先生丨1 小时前
日语单词 Web Page
前端·css·css3
禅思院2 小时前
AI对话前端从入门到崩溃:一个长对话引发的五层优化战争【引子】
前端·面试·架构
TrisighT3 小时前
Electron 鸿蒙 PC 上点外链唤醒应用,我试了 6 种写法只有 1 种能跑
前端·electron·harmonyos
2501_930707783 小时前
如何将HTML文件转换为纯文本(详细步骤指南)
前端·html
天才熊猫君4 小时前
配置与数据分离:一种可视化搭建的属性编辑方案
前端·javascript