vue

vue html2canvas 钉钉

2019-05-14  本文已影响60人  hsqin

以前写过PC浏览器上的html2Canvas,这次是给公司开发钉钉应用,需要在钉钉应用里面上传图片后,并和其他图片、二维码一起,绘制成一个宣传海报。具体步骤见下图:


1.png 2-上传之后.png 3-点击生成海报.png

遇到的问题

1,背景图片模糊问题

2,图片跨域问题

3,钉钉中下载图片问题

4,生成的图片大小与左侧不一致,有空白

5,二维码生成后,无法在微信识别

document.getElementById("j_design_code").innerHTML = '';
let qrDesCode = new QRCode('j_design_code', {
width: 200,
height: 200,
text: 'xxxx', // 二维码内容
render: 'table' // 设置渲染方式(有两种方式 table和canvas,默认是canvas)
});

用到的方法

getBase64(img){
        function getBase64Image(img,width,height) {//width、height调用时传入具体像素值,控制大小 ,不传则默认图像大小
          var canvas = document.createElement("canvas");
          canvas.width = width ? width : img.width;
          canvas.height = height ? height : img.height;

          var ctx = canvas.getContext("2d");
          ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
          var dataURL = canvas.toDataURL();
          return dataURL;
        }

        var image = new Image();
        image.crossOrigin = 'Anonymous';
        image.src = img;
        var deferred=$.Deferred();
        if(img){
          image.onload =function (){
            deferred.resolve(getBase64Image(image));//将base64传给done上传处理
          }
          return deferred.promise();//问题要让onload完成后再return sessionStorage['imgTest']
        }
      },
base64ToBlob(urlData) {
        var arr = urlData.split(',');
        var mime = arr[0].match(/:(.*?);/)[1] || 'image/png';
        // 去掉url的头,并转化为byte
        var bytes = window.atob(arr[1]);
        // 处理异常,将ascii码小于0的转换为大于0
        var ab = new ArrayBuffer(bytes.length);
        // 生成视图(直接针对内存):8位无符号整数,长度1个字节
        var ia = new Uint8Array(ab);

        for (var i = 0; i < bytes.length; i++) {
          ia[i] = bytes.charCodeAt(i);
        }

        return new Blob([ab], {
          type: mime
        });
      },base64ToBlob(urlData) {
        var arr = urlData.split(',');
        var mime = arr[0].match(/:(.*?);/)[1] || 'image/png';
        // 去掉url的头,并转化为byte
        var bytes = window.atob(arr[1]);
        // 处理异常,将ascii码小于0的转换为大于0
        var ab = new ArrayBuffer(bytes.length);
        // 生成视图(直接针对内存):8位无符号整数,长度1个字节
        var ia = new Uint8Array(ab);

        for (var i = 0; i < bytes.length; i++) {
          ia[i] = bytes.charCodeAt(i);
        }

        return new Blob([ab], {
          type: mime
        });
      },

注意:返回的是 new Blob类型,不能直接用于img的src,需要用window.URL.createObjectURL(Blob) 转换为blob:http://192.xxxx/xx

详细讲解

"html2canvas": "^1.0.0-rc.1",
"jquery": "^3.3.1",

import QRCode from 'qrcodejs2' --生成二维码
import $ from 'jquery' --图片转base64的时候用到
import html2canvas from 'html2canvas';

uploadSuc{
        that.getBase64(that.noteImg)
              .then(function (base64) {
                that.uploadImgData = base64;
              }, function (err) {
                console.log(err);
              });
}

//html中直接用uploadImgData作为src
<div class="note-main">
      <img :src="uploadImgData" alt="">
</div>
//生成海报并在右侧预览
previewFun(){
        let that = this;

        html2canvas(that.$refs.imageWrapper,{
          backgroundColor: null,
          async: true,
          scale:5
        }).then((canvas) => {
          let dataURL = canvas.toDataURL("image/png");

          let tmpBlob = that.base64ToBlob(dataURL);
          that.designImgDataURL = window.URL.createObjectURL(tmpBlob);
          console.log('预览的海报blob图片  ',that.designImgDataURL);
        });
 },

//html中代码
<div class="flex-item design-right">
     <img class="design-img" :src="designImgDataURL" alt="">
     <div style="text-align: right;" v-show="designImgDataURL">
           <a :href="designImgDataURL" class="design-download" target="_blank" 
:download="designRow.studentName+'.png'">点击下载</a>
      </div>
</div>
html结构.png
上一篇 下一篇

猜你喜欢

热点阅读