uniapp APP端使用html2canvas截图分享小程序卡片图片模糊、跨域等问题解决

项目场景:

项目场景: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了,也就间接解决了跨域问题了。

      还有其他的解决方法,我列的这个是我遇到的哦....