vue中base64图片生成海报图

效果图展示
在这里插入图片描述

 <div style="border-right: 1px solid #cccccc;margin: 0 20px 30px 0">
        <el-row  class="text-center">
          <div class="hidden" style="display: none;">
            <canvas id="mycanvas" :width="w" :height="h" />
            <img class="goodsImg" src="" alt="" crossOrigin="*">
          </div>
          <img class="postImg"   src alt>

        </el-row>
        <el-row>
          <el-col :span="24" class="text-center">
            <el-button
              type="text"
              icon="iconfont icon-xiazai3 "
              style="padding-right: 20px"
              class="text-bold"
              @click="downImage()">下载图片</el-button>
            <el-button type="text"
                       icon="iconfont icon-fuzhi"
                       class="text-black text-bold"
                       @click="copyImage">复制图片</el-button>
          </el-col>
        </el-row>
        <el-row>
   
        </el-row>

      </div>
export default {
    name: 'fenpei',
    data() {
      return {
        w: 280,
        h: 340,
        info: {
          url: '',
          goodsImg: '/static/images/qyxx_phbj.png',
          god1: '',
          title: ''

        },
        haibaoImage: '',
        ArtificersList: [],
        openId: '',
        lstEleUid: [],
        queryInfo: {
          openId: ''
        }
      }
    },
    mounted() {
      this.getImgBase64()
 
      this.getWxWeibaoInvite() // 获取技师二维码
      this.info.title = getPersonName() // 获取标题名称
    },

    methods: {
   
      // 获取人员二维码
      getWxWeibaoInvite() {
        getWxWeibaoInvite().then(res => {
          this.info.url = 'data:image/png;base64,' + res.result
          this.draw()
        }).catch((err) => {

        })
      },
      // base64图片转换
      getImgBase64(src) {
        var base64 = ''
        var img = new Image()
        img.src = this.info.goodsImg
        const that = this
        img.onload = function() {
          base64 = that.image2Base64(img)
          that.info.god1 = base64 // 背景图片
        }
      },
      image2Base64(img) {
        var canvas = document.createElement('canvas')
        canvas.width = img.width
        canvas.height = img.height
        var ctx = canvas.getContext('2d')
        ctx.drawImage(img, 0, 0, img.width, img.height)
        var dataURL = canvas.toDataURL('image/jpg')
        return dataURL
      },
      // 绘制图片
      draw() {
        const qrImg = new Image() // 创建二维码图片对象
        qrImg.src = this.info.url // 二维码 base64 链接码

        const proImg = new Image() // 创建二维码图片对象
        proImg.src = this.info.god1 // 二维码 base64 链接码
        let goodsImg = ''
        goodsImg = document.querySelector('.goodsImg')
        goodsImg.src = this.info.goodsImg // 网络图片地址

        // 开始绘制
        goodsImg.onload = () => {
          const canvas = document.getElementById('mycanvas')
          const ctx = canvas.getContext('2d', {
            antialias: true // 是画质更清晰  其他配置可以参考文档
          })
          ctx.drawImage(proImg, 0, 0, 280, 340) // 绘制背景图片
          ctx.drawImage(qrImg, 90, 120, 100, 100) // 绘制二维码
          // 绘制标题
          const first = this.cutString(this.info.title,24) // 标题过长时...省略
          ctx.fillStyle = '#ffffff'
          ctx.font = '18px PingFangSC-Regular,PingFang SC'
          ctx.textAlign = 'center' //标题居中
          ctx.fillText(first, 140, 90) // 第一数为距离左边的距离,第二个数为距离上边的距离
          const Url = document.getElementById('mycanvas').toDataURL('image/png') // 转base64
          document.querySelector('.postImg').src = Url // 展示图片
          this.haibaoImage = Url // 海报图片地址
          // 这里又写了一遍,因为出现二维码没有绘制出来的情况
          qrImg.onload = () => {
            ctx.drawImage(proImg, 0, 0, 280, 340) // 绘制背景图片
            ctx.drawImage(qrImg, 90, 120, 100, 100) // 绘制二维码
            const Url = document.getElementById('mycanvas').toDataURL('image/png')
            document.querySelector('.postImg').src = Url
          }
        }
      },
      //字符串截取
      cutString(str, len) {
        //length属性读出来的汉字长度为1
        if (str.length * 2 <= len) {
          return str;
        }
        var strlen = 0;
        var s = "";
        for (var i = 0; i < str.length; i++) {
          s = s + str.charAt(i);
          if (str.charCodeAt(i) > 128) {
            strlen = strlen + 2;
            if (strlen >= len) {
              return s.substring(0, s.length - 1) + "...";
            }
          } else {
            strlen = strlen + 1;
            if (strlen >= len) {
              return s.substring(0, s.length - 2) + "...";
            }
          }
        }

        return s;

      },
      // 下载图片
      downImage() {
        var a = document.createElement('a')
        a.href = this.haibaoImage // 海报图片地址
        a.download = '分配海报图片.png'
        a.click()
      },
      copyImage() {
        let input = document.createElement("textarea");
        // var imgFile = this.dataURLtoFile(this.haibaoImage)
        var imgFile = this.haibaoImage
        // console.log('imgFile1111',imgFile)
        input.value = imgFile;
        document.body.appendChild(input);
        input.select();
        input.setSelectionRange(0, input.value.length);
        document.execCommand('Copy');
        document.body.removeChild(input);
        console.log("复制成功")     //"复制成功"
        // alert("复制成功")
        this.$message({
          message: '复制成功',
          type: 'success'
        })
      },
      //base64格式图片转换为文件
      dataURLtoFile(dataurl, filename = 'file') {
        let arr = dataurl.split(',')
        let mime = arr[0].match(/:(.*?);/)[1]
        let suffix = mime.split('/')[1]
        let bstr = atob(arr[1])
        let n = bstr.length
        let u8arr = new Uint8Array(n)
        while (n--) {
          u8arr[n] = bstr.charCodeAt(n)
        }
        return new File([u8arr], `${filename}.${suffix}`, {
          type: mime
        })
      }

    }

  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值