当前位置:   article > 正文

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

uniapp 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的截图函数:

  1. <script module="canvasToImage" lang="renderjs">
  2. import html2canvas from 'html2canvas';
  3. export default {
  4. data() {
  5. return {}
  6. },
  7. methods: {
  8. getImage(event, ownerInstance) {
  9. ownerInstance.callMethod('showLoading', {})
  10. //containert为需要操作的dom节点,也就是定义的id值
  11. var dom = document.getElementById('containert');
  12. html2canvas(dom, {
  13. width: window.clientWidth,
  14. height: 200,
  15. useCORS: true,
  16. scale: 1,
  17. dpi: 1000
  18. }).then(function(canv) {
  19. let url = canv.toDataURL('image/jpg'); // base64数据
  20. //getImgToShare回调到主script的函数
  21. ownerInstance.callMethod('getImgToShare', {
  22. base64data: url,
  23. })
  24. });
  25. },
  26. }
  27. }
  28. </script>

 2)、在主script定义回调函数“getImgToShare”,用于处理分享逻辑

  1. getImgToShare(data) {
  2. let that=this
  3. let base64data = data.base64data;
  4. let bitmap = new plus.nativeObj.Bitmap("test");
  5. bitmap.loadBase64Data(base64data, function() {
  6. let url = '_downloads/yflPic' + Date.now() + '.png';
  7. bitmap.save(url, {}, function(i) {
  8. var obj={
  9. title: '分享标题',
  10. path: '分享的小程序路径',
  11. appid: '小程序原始id originalId',
  12. imageUrl:url
  13. }
  14. uni.share({
  15. provider: 'weixin',
  16. scene: "WXSceneSession",
  17. type: 5,
  18. imageUrl: obj.imageUrl',
  19. title: obj.title,
  20. miniProgram: {
  21. id: obj.appid,
  22. path: obj.path,
  23. type: 0,
  24. webUrl: 'http://uniapp.dcloud.io'
  25. },
  26. success: ret => {
  27. console.log(JSON.stringify(ret));
  28. }
  29. });
  30. }, function(e) {
  31. bitmap.clear();
  32. });
  33. }, function() {
  34. bitmap.clear();
  35. });
  36. },

 3)页面触发:@click="canvasToImage.getImage"

  1. <view class="share-app" @click="canvasToImage.getImage">
  2. <image class="clap-detail-comment_btn_img" :src="imgServer('ruralRevitalization/clapDetail/comment-share.png')"></image>
  3. </view>

4)定义需要截取的dom,对需要操作的标签用 id="containert"标记

  1. <view class="mainBox" id="containert">
  2. <view class="">
  3. 截取内容
  4. </view>
  5. </view>

 解决方案:

  以上步骤就能实现了截图分享小程序功能,现在来解决开头说的两个问题:

 问题1、分享的卡片图片模糊

  在代码中找到如下代码:

  1. html2canvas(dom, {
  2. width: window.clientWidth,//画布宽度
  3. height: 200,//画布高度
  4. useCORS: true,//支持跨越
  5. scale: 1,//缩放比例
  6. dpi: 1000//图片尺寸
  7. })

  参数调整,不同的页面可能需要调整不同的参数才能得到清晰的图片:

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

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号