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绘制图片绘制质量的大小,这个要先确认好