在开发过程当中遇到这么一个需求,h5页面须要将一个html dom转化成图片,便于用户保存。html
二者在写这篇笔记以前在github上的星星数分别是ios
dom-to-image 4k ⭐️git
html2canvas 13.7k ⭐️github
二者都有尝试过,都有意想不到的bug,包括canvas
等等跨域
利用canvas的toDataURL来拿到canvas转化的base64码,来替换img的url, 也能够把图片上传到公司的服务器上,获得图片的地址来进行下载,或做为参数来传递浏览器
那么canvas的绘制主要就是文本和图片的绘制,文本绘制相对简单,图片绘制有一些注意点。服务器
因为最后生成的图片可能会模糊,能够尽可能画大一点画布,能够按照设计图来dom
<canvas id="canvas" width="750" height="1164"> 你的浏览器竟然不支持Canvas?!赶快换一个吧!! </canvas>
let c = document.getElementById("canvas"); let ctx = c.getContext("2d");
ctx.fillStyle = "#fff"; ctx.font = "32px PingFangSC-Regular"; ctx.textAlign = "left"; ctx.fillText("这是一些文字", 280, 755);
const instBanner = document.getElementById("instBanner"); instBanner.crossOrigin = "anonymous";
const posterBg = new Image(); posterBg.src = mainBg; posterBg.onload = () => { ctx.drawImage(posterBg, 0, 0, 750, 1164); }
const posterBg = new Image(); posterBg.src = 'https:....'; //这里是图片url posterBg.crossOrigin = "anonymous"; posterBg.onload = () => { ctx.drawImage(posterBg, 0, 0, 750, 1164); }
let dataURL = c.toDataURL("image/png"); let canvasImg = document.getElementById("canvasImg"); canvas.src = dataURL;
let dataURL = c.toDataURL("image/png"); function getImgUrl(dataURL){ //一些上传服务器的代码 return imgUrl } let imgUrl = getImgUrl(); let canvasImg = document.getElementById("canvasImg"); canvas.src = imgUrl;
ctx.save(); ctx.beginPath(); //开始绘制 //先画个圆 前两个参数肯定了圆心 (x,y) 坐标 第三个参数是圆的半径 四参数是绘图方向 默认是false,即顺时针 ctx.arc(60, 60, 30, 0 * Math.PI, 2 * Math.PI); ctx.clip();//画好了圆 剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则全部以后的绘图都会被限制在被剪切的区域内 这也是咱们要save上下文的缘由 ctx.drawImage('https:....', 30, 30, 60, 60); contex.restore(); //恢复以前保存的绘图上下文 恢复以前保存的绘图上下午即状态 还能够继续绘制
/**该方法用来绘制圆角矩形 *@param cxt:canvas的上下文环境 *@param x:左上角x轴坐标 *@param y:左上角y轴坐标 *@param width:矩形的宽度 *@param height:矩形的高度 *@param radius:圆的半径 *@param lineWidth:线条粗细 *@param strokeColor:线条颜色 **/ function strokeRoundRect(cxt,x,y,width,height,radius,/*optional*/lineWidth,/*optional*/strokeColor){ //圆的直径必然要小于矩形的宽高 if(2*radius>width || 2*radius>height){return false;} cxt.save(); cxt.translate(x,y); //绘制圆角矩形的各个边 drawRoundRectPath(cxt,width,height,radius); cxt.lineWidth = lineWidth||2;//如果给定了值就用给定的值不然给予默认值2 cxt.strokeStyle=strokeColor||"#000"; cxt.stroke(); cxt.restore(); } /**该方法用来绘制一个有填充色的圆角矩形 *@param cxt:canvas的上下文环境 *@param x:左上角x轴坐标 *@param y:左上角y轴坐标 *@param width:矩形的宽度 *@param height:矩形的高度 *@param radius:圆的半径 *@param fillColor:填充颜色 **/ function fillRoundRect(cxt,x,y,width,height,radius,/*optional*/fillColor){ //圆的直径必然要小于矩形的宽高 if(2*radius>width || 2*radius>height){return false;} cxt.save(); cxt.translate(x,y); //绘制圆角矩形的各个边 drawRoundRectPath(cxt,width,height,radius); cxt.fillStyle=fillColor||"#000";//如果给定了值就用给定的值不然给予默认值 cxt.fill(); cxt.restore(); } function drawRoundRectPath(cxt,width,height,radius){ cxt.beginPath(0); //从右下角顺时针绘制,弧度从0到1/2PI cxt.arc(width-radius,height-radius,radius,0,Math.PI/2); //矩形下边线 cxt.lineTo(radius,height); //左下角圆弧,弧度从1/2PI到PI cxt.arc(radius,height-radius,radius,Math.PI/2,Math.PI); //矩形左边线 cxt.lineTo(0,radius); //左上角圆弧,弧度从PI到3/2PI cxt.arc(radius,radius,radius,Math.PI,Math.PI*3/2); //上边线 cxt.lineTo(width-radius,0); //右上角圆弧 cxt.arc(width-radius,radius,radius,Math.PI*3/2,Math.PI*2); //右边线 cxt.lineTo(width,height-radius); cxt.closePath(); }
» 点击阅读原文iphone