html2canvas微信头像没绘制,解决使用canvas生成含有微信头像的邀请海

本站最新发布   C#从入门到精通

试听地址https://www.xin3721.com/eschool/CSharpxin3721/

最近做了一个微信内访问的H5页面,长按分享图片发送朋友邀请的海报,网上搜索资料,得出解决思路,用canvas将页面绘制生成图片,

问题:canvas 图片跨域。

解决过程(填坑历程):

1.从网上存在如图解决办法     img.crossOrigin  = ""   (专业采坑,数年)。亲测无效。很是不解。

8be41f018874e77775b4591967399e14.png

2.网上也存在后端服务解决

设置header头,或者nginx 服务配置等 允许访问。但是,存在问题(图片大部分为了优化,都会存放在第三方cdn.上面。这是第三方的配置,是否允许,自己很难控制)

3.解决办法:采用所有图片路径,转化为base64流来处理。图片存为本地图片。这也可以就避开了跨域问题。

最后个人解决方法:没有采用第3种保存本地,这样会增加本地图片,而且会存在本地跟微信端没有同步更新的问题,不是用户最新的头像。个人是采用远程下载后直接绘制输出图片,这样图片就变成本地图片,解决canvas绘制图片不支持跨域问题。

wxheadimg.aspx 页面代码:

canvas绘制页面引用:wxheadimg.aspx?data=headimgurl

canvas绘制代码也顺便弄出来:

74215c2a6c4ad07f626b75a612f2002c.gif

{varIMAGE_URL;functiontakeScreenshot(){var shareContent = document.getElementById('shareMember');//需要截图的包裹的(原生的)DOM 对象

var width = shareContent.offsetWidth; //获取dom 宽度

var height = shareContent.offsetHeight; //获取dom 高度

var canvas = document.createElement("canvas"); //创建一个canvas节点

var scale = 1; //定义任意放大倍数 支持小数

canvas.width = width * scale; //定义canvas 宽度 * 缩放

canvas.height = height * scale; //定义canvas高度 *缩放

canvas.getContext("2d").scale(scale, scale); //获取context,设置scale

//var rect = shareContent.getBoundingClientRect();//获取元素相对于视察的偏移量

//canvas.getContext("2d").translate(-rect.left, -rect.top);//设置context位置,值为相对于视窗的偏移量负值,让图片复位

var opts ={

scale:scale,//添加的scale 参数

canvas:canvas, //自定义 canvas

logging: true, //日志开关

width:width, //dom 原始宽度

height:height, //dom 原始高度

backgroundColor: 'transparent',

};

html2canvas(shareContent, opts,{useCORS:true,logging:true}).then(function(canvas)

{

IMAGE_URL= canvas.toDataURL("image/png");

$('.copyImage').attr('src',IMAGE_URL);

})

}

takeScreenshot();

}

74215c2a6c4ad07f626b75a612f2002c.gif

页面代码 :

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序是基于小程序框架开发的,小程序的渲染机制和浏览器不同,它只支持部分HTML标签和CSS属性,并且有完整的DOM和BOM,所以不能直接使用HTML2Canvas库。但是,可以使用微信小程序官方提供的canvas组件,通过canvas API绘制出需要的内容,然后保存为图片。具体实现方法如下: 1. 在wxml文件中添加canvas组件 ```html <canvas canvas-id="myCanvas"></canvas> ``` 2. 在js文件中获取canvas组件上下文,绘制需要的内容 ```javascript // 获取canvas上下文 const ctx = wx.createCanvasContext('myCanvas') // 绘制文本 ctx.setFillStyle('#333') ctx.setFontSize(16) ctx.fillText('Hello World', 10, 20) // 绘制图片 ctx.drawImage('/images/avatar.png', 20, 50, 50, 50) // 绘制完成后保存为图片 ctx.draw(false, () => { wx.canvasToTempFilePath({ canvasId: 'myCanvas', success: (res) => { console.log(res.tempFilePath) } }) }) ``` 3. 如果需要绘制HTML内容,可以先将HTML转换为canvas可识别的格式,例如使用html2canvas将HTML转换为canvas,然后再将canvas绘制到小程序的canvas组件上。 ```javascript import html2canvas from 'html2canvas' // 将HTML转换为canvas html2canvas(document.querySelector('#myHtml')).then((canvas) => { // 绘制canvas const ctx = wx.createCanvasContext('myCanvas') ctx.drawImage(canvas, 0, 0, canvas.width, canvas.height) ctx.draw(false, () => { wx.canvasToTempFilePath({ canvasId: 'myCanvas', success: (res) => { console.log(res.tempFilePath) } }) }) }) ``` 注意:html2canvas库并不是官方提供的库,需要通过npm安装后引入使用。另外,小程序的canvas组件有大小限制,最大宽度不能超过2000px,最大高度不能超过2000px,超过限制会导致绘制失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值