python html转图片失真_html dom 转化成图片踩坑记(canvas toDataURL)

需求

在开发过程中遇到这么一个需求,h5页面需要将一个html dom转化成图片,便于用户保存。

面向百度搜索第三方得 html2canvas 和 dom-to-image

两者在写这篇笔记之前在github上的星星数分别是

dom-to-image 4k ⭐️

html2canvas 13.7k ⭐️

两者都有尝试过,都有意想不到的bug,包括

部分手机有某些背景图片无法展示,为空白

iphone8 plus ios 11中根本不调用这个转换方法,从而得不到想要的图片。

等等

自己动手

思路

利用canvas的toDataURL来拿到canvas转化的base64码,来替换img的url, 也可以把图片上传到公司的服务器上,得到图片的地址来进行下载,或作为参数来传递

那么canvas的绘制主要就是文本和图片的绘制,文本绘制相对简单,图片绘制有一些注意点。

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);

图片绘制

官方文档如图

注意事项

图片需要进行跨域处理,否则后期无法生成图片,也就是在img标签中增加crossOrigin属性,值为anonymous

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);

}

生成图片

替换img src

let dataURL = c.toDataURL("image/png");

let canvasImg = document.getElementById("canvasImg");

canvas.src = dataURL;

上传服务器,得到img url(可作为参数,保存图片)

let dataURL = c.toDataURL("image/png");

function getImgUrl(dataURL){

//一些上传服务器的代码

return imgUrl

}

let imgUrl = getImgUrl();

let canvasImg = document.getElementById("canvasImg");

canvas.src = imgUrl;

最后奉上一些,常用的canvas处理方法

圆形图片的绘制

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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值