zoukankan      html  css  js  c++  java
  • 生成动态海报,带二维码

    前提:装插件html2canvas 、QRCode

    <div class="dialog-content" id="posterHtml">
            <img :src="posterPageTemplate">
            <!-- 二维码 -->
            <div class="qrcode"><div id="qrcodeImg"></div></div>
            <p class="txt-center tips fs-24">长按图片识别二维码,立即申请!</p>
          </div>
    <script>
    import html2canvas from 'html2canvas'
    import QRCode from 'qrcodejs2'
    import utils from '@/components/utils'
    export default {
      props: {
        visible: {
          type: Boolean,
          default: false
        }
      },
      data () {
        return {
          isShow: false,
          config: { // 二维码参数
            downloadFilename: '专属海报'
          },
          posterImg: '', // 最终生成的海报图片
          qrcode: '',
          qrcodeUrl: '', // 二维码链接
          posterPageTemplate: '' // 专属海报页背景图
        }
      },
      mounted () {
        this.getData()
      },
      methods: {
        imageUrlToBase64 (url) {
          // 一定要设置为let,不然图片不显示
          let image = new Image()
    
          // 解决跨域问题
          image.setAttribute('crossOrigin', 'anonymous')
    
          let imageUrl = url
          image.src = imageUrl
    
          // image.onload为异步加载
          image.onload = () => {
            let canvas = document.createElement('canvas')
            canvas.width = image.width
            canvas.height = image.height
            let context = canvas.getContext('2d')
            context.drawImage(image, 0, 0, image.width, image.height)
    
            let quality = 0.8
            // 这里的dataurl就是base64类型
            let dataURL = canvas.toDataURL('image/jpeg', quality)// 使用toDataUrl将图片转换成jpeg的格式,不要把图片压缩成png,因为压缩成png后base64的字符串可能比不转换前的长!
            this.posterPageTemplate = dataURL
            if (utils.isIOS && ('addEventListener' in document)) {
              this.$loading.show()
              console.log('ios设备')
              setTimeout(() => {
                this.showPoster()
              }, 1000)
            } else {
              console.log('android设备')
              this.showPoster()
            }
          }
        },
        // 关闭弹框
        closeDialog () {
          this.$emit('close')
          // 清除二维码
          this.qrcode.clear()
        },
        getData () {
          // posterImg 请求接口获取海报图片
          // 请求接口开始 ======
          let posterImg = ''
          this.imageUrlToBase64(posterImg)
        },
        createQrcode () {
          // 生成二维码
          const qrcodeImgEl = document.getElementById('qrcodeImg')
          qrcodeImgEl.innerHTML = ''
          this.qrcode = new QRCode(qrcodeImgEl, {
             105,
            height: 105,
            colorDark: '#000000',
            colorLight: '#ffffff',
            text: this.qrcodeUrl, // 设置二维码内容或跳转地址
            correctLevel: QRCode.CorrectLevel.H
          })
        },
        createPoster () {
          this.createQrcode()
          // 生成海报
          const _this = this
          const domObj = document.getElementById('posterHtml')
          html2canvas(domObj, {
            useCORS: true, // 允许图片跨域
            allowTaint: false,
            logging: false,
            letterRendering: false,
            scale: window.devicePixelRatio
          }).then((canvas) => {
            // 在微信里,可长按保存或转发
            _this.posterImg = canvas.toDataURL()
            // console.log(_this.posterImg)
          })
        },
        // 显示海报
        showPoster () {
          this.$nextTick(() => {
            this.createPoster()
            this.createQrcode()
          })
          this.$loading.hide()
          this.isShow = true
        }
      }
    }
    </script>
  • 相关阅读:
    Mysql中的递归查询
    让git忽略对已经版本控制的文件的本地修改
    关于c#中逆变和协变的理解
    把之前的相关博客都迁到了博客园~
    结合github pages使用travis CI
    Spring中的Filter、HandlerInterceptor和AOP
    HDU1711 Number Sequence 题解 KMP算法
    HDU1358 Period 题解 KMP算法
    HDU1686 Oulipo 题解 KMP算法
    HDU3336 Count the string 题解 KMP算法
  • 原文地址:https://www.cnblogs.com/adbg/p/14042442.html
Copyright © 2011-2022 走看看