canvas转图片,图片下载完成后生成base64再画图


1.图片转base64:

imgToBase64:function(imgUrl) {
        return new Promise(function(resolve,reject){
            if(/^https?/.test(imgUrl)){
                imgUrl = imgUrl.replace(/^https?/, 'https');
            }else{
                resolve(imgUrl);
                console.warn('请传入https路径');
            }
            window.URL = window.URL || window.webkitURL;
            var xhr = new XMLHttpRequest();
            xhr.open("get", imgUrl+'?'+Math.random(), true);
            xhr.responseType = "blob";
            xhr.onload = function () {
                if (this.status == 200) {
                    var src = window.URL.createObjectURL(this.response);
                    resolve(src);
                }else{
                    reject({src:imgUrl,msg:'Img onLoad Error'});
                }
            };
            xhr.onerror = function(){
                reject({src:imgUrl,msg:'Img onLoad Error'});
            }
            xhr.send();
        })
    }

2.公用方法:

// canvas转图片,图片下载完成后生成base64再画图。arrImg:所需网络图片数组;successCallback:成功的回调,返回所有图片的二进制;errorCallback:错误回调,返回没有下载成功的图片
getImgBase64:function(arrImg,successCallback,errorCallback){
        if(arrImg && arrImg.length > 0){
            for(var i = 0;i < arrImg.length; i++){
                arrImg[i] = this.imgToBase64(arrImg[i]);
            }
            Promise.all(arrImg).then(function (res) {
                successCallback && successCallback(res);
            }).catch(function(err){
                console.log(err);
                errorCallback && errorCallback(err);
            });
        }
}

3.绘制的时候方法:

1.页面js引入html2canvas.min.js-官网cdn

2.绘制代码

// 页面点击绘制canvas方法
        goDraw () {
            //绘制的时候回到页面最上方
            document.documentElement.scrollTop = 0;
            base.getImgBase64( this.arrImg, ( res ) => {
            //这个是需要转base64的图片调用方法
                [
                    this.codeImg,
                    this.headerPic
                ] = res;
                //绘制的区域box
                const gradeBox = document.querySelector( '.grade-box' );
                this.$nextTick( () => {
                    window.html2canvas( gradeBox, {
                        y: gradeBox.offsetTop, // 用于解决上方白屏问题
                        ignoreElements ( item ) { // 忽略不想绘制的元素节点
                            if ( item.classList.contains( 'no-draw' ) ) {
                                return true;
                            }
                            return false;
                        },
                        //允许跨域资源共享,注意不能与 allowTaint 同时配置为 true
                        useCORS: true,
                        // 获取渲染宽度和高度
                        height: gradeBox.getBoundingClientRect().height ,
                        width: gradeBox.offsetWidth,
                    } ).then( ( canvas ) => {
                    //绘制的图片
                      this.html2canvasBase64 = canvas.toDataURL( 'image/jpeg' );
                    } );
                } );
            }, error => {
                console.log('错误提示');
            } );
        }               

4.canvas画图时候须注意的点:

  1. 绘制的*canvas*需要让绘制之前的容器高度和绘制时的容器高度保持一致,这样会避免出现白边。

    例如: 涉及到按钮啥的绘制之后不展示,这时就需要给相关*dom*一个高度

    涉及到margin距离,可能不需要*,*就需要注意一下*,*是不是可以设置成*0*

  2. 有时候客户端会限制canvas绘制图片绘制质量的大小,这个要先确认好