赞
踩
项目场景:uniapp APP端,分享小程序到微信好友,使用html2canvas截取当前页面做卡片封面图。仅是需要展示部分内容用作卡片封面就可以,不强制需要全屏截图。
问题1、部分页面截取到的图片分享到微信后卡片图片模糊。
问题2、截图时报错:Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported。
APP端 html2canvas截图步骤:
1、npm方式下载
npm i html2canvas
2、引用 html2canvas
import html2canvas from 'html2canvas'
3、APP中需要用renderjs方式进行,开始截图:
1)在需要截图的页面定义如下renderjs的截图函数:
- <script module="canvasToImage" lang="renderjs">
- import html2canvas from 'html2canvas';
- export default {
- data() {
- return {}
- },
- methods: {
- getImage(event, ownerInstance) {
- ownerInstance.callMethod('showLoading', {})
- //containert为需要操作的dom节点,也就是定义的id值
- var dom = document.getElementById('containert');
- html2canvas(dom, {
- width: window.clientWidth,
- height: 200,
- useCORS: true,
- scale: 1,
- dpi: 1000
- }).then(function(canv) {
- let url = canv.toDataURL('image/jpg'); // base64数据
- //getImgToShare回调到主script的函数
- ownerInstance.callMethod('getImgToShare', {
- base64data: url,
- })
- });
- },
- }
- }
- </script>
2)、在主script定义回调函数“getImgToShare”,用于处理分享逻辑
getImgToShare(data) { let that=this let base64data = data.base64data; let bitmap = new plus.nativeObj.Bitmap("test"); bitmap.loadBase64Data(base64data, function() { let url = '_downloads/yflPic' + Date.now() + '.png'; bitmap.save(url, {}, function(i) { var obj={ title: '分享标题', path: '分享的小程序路径', appid: '小程序原始id originalId', imageUrl:url } uni.share({ provider: 'weixin', scene: "WXSceneSession", type: 5, imageUrl: obj.imageUrl', title: obj.title, miniProgram: { id: obj.appid, path: obj.path, type: 0, webUrl: 'http://uniapp.dcloud.io' }, success: ret => { console.log(JSON.stringify(ret)); } }); }, function(e) { bitmap.clear(); }); }, function() { bitmap.clear(); }); },
3)页面触发:@click="canvasToImage.getImage"
- <view class="share-app" @click="canvasToImage.getImage">
- <image class="clap-detail-comment_btn_img" :src="imgServer('ruralRevitalization/clapDetail/comment-share.png')"></image>
- </view>
4)定义需要截取的dom,对需要操作的标签用 id="containert"标记
- <view class="mainBox" id="containert">
- <view class="">
- 截取内容
- </view>
- </view>
以上步骤就能实现了截图分享小程序功能,现在来解决开头说的两个问题:
问题1、分享的卡片图片模糊
在代码中找到如下代码:
- html2canvas(dom, {
- width: window.clientWidth,//画布宽度
- height: 200,//画布高度
- useCORS: true,//支持跨越
- scale: 1,//缩放比例
- dpi: 1000//图片尺寸
- })
参数调整,不同的页面可能需要调整不同的参数才能得到清晰的图片:
1、 width,画布的宽度,这个不用调整;
2、height,画布的高度,有时候页面可能有很多内容,高度太长,截取到的图片也会模糊,所 以可以写一个固定值,具体值多少可根据实际效果来定,
3、useCORS: true 支持跨域,不需要改
4、scale,缩放比例,值越高,图片越高清,默认值为1,可适当提高
5、dpi,dpi是指某些设备分辨率的度量单位。dpi越低,扫描的清晰度越低,dpi越高,清晰 度越高.
所以我们可以动态调整height、scale、dpi这三个值,就可以得到清晰的图片。
问题二、截图时报错:Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported。
1、页面如果同时出现加载本地图片和网络图片的,需要把加载本地图片的image转为base64后再截图。网络图片需要支持跨域。
2、如果对截图内容不是很在意的可以使用“data-html2canvas-ignore="true"”忽略掉某个image,这样绘制时就不会去处理这个image了,也就间接解决了跨域问题了。
还有其他的解决方法,我列的这个是我遇到的哦....
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。