使用html2canvas将页面转换成图片的采坑记录

 "html2canvas": "^1.4.1","@tarojs/taro": "3.4.0-beta.0"

问题:

1. 生成的图片很模糊
2. 生成的图片是空白
3. 生成的图片不完整

截图前是这样

截图后这样

截图后的图片图片缺省了一部分

解决方案

问题1: 生成的图片很模糊(图片跨域)

方法一: 将canvas放大n倍再作图;

移动端的话,根据移动设备的devicePixelRatio (devicePixelRatio 返回当前显示设备的物理像素分辨率与CSS 像素分辨率之比)决定缩放比例;也可以默认放大两倍转换

方法二: 使用<img>来实现background-image的效果

只有作为background-image的背景图会模糊,而<img>图片标签是没有这个问题的。

问题2: 生成的图片是空白(图片跨域)

首先确定转换后的canvas的宽高是否正确,如果不正确,就需要给html2canvas传递宽高参数 !!!

没有宽高问题,然后再细细排查发现,在使用 转换的时候图片有跨域问题,导致转换失败,所以转换成了空白图片(大概率都是这个原因);将图片去掉就可以正常转换页面的

解决方案:

方案一:

后端需要在服务器IIS上的HTTP响应标头设置,最简单粗暴的方法就是全部设置成*,不过这样安全性也低,自己可以根据自己需求设置

access-control-allow-credentials:true
Access-Control-Allow-Headers:*
access-control-allow-origin:*

方案二:

在要生成canvas的DOM中的每一个img标签上设置 crossorigin="anonymous" 属性,并且给资源地址加上固定的随机数(避免缓存)

  1. 给html2anvas添加useCORS:true属性
  2. 给要生成canvas的DOM中的每一个img标签上设置 crossorigin="anonymous" 属性
  3. 确保你的图片CDN服务器支持CORS访问,也就是会返回Access-Control-Allow-Origin等响应头

在Taro中给img加上该属性之后没生效,因为
在taro中节点被把包裹了一层taro-image-core节点导致img属性并没有设置到img上(所有在taro上该方法不适用)

方案三:

使用html2canvas提供的跨域解决方案
allowTaint: trueuseCORS: true 都是解决跨域问题的方式,不同的是使用allowTaint 会对canvas造成污染,导致无法使用canvas.toDataURL 方法;所以这里就给html2canvas添加useCORS: true,试了一下还是跨域 -.-

方案四

修改html2canvas的源码(最终解决方案)
核心思想也就是使用方法二,修改html2canvas源码:


1.给 html2canvas添加useCORS: true 参数
2. 设置 img.crossOrigin = 'anonymous'(img.crossOrigin = ""和img.crossOrigin = 'anonymous’是等价的)
3.给资源地址添加
时间戳数/一个固定的字符串,避免读取到浏览器缓存数据,推荐后者

设置好红框里的内容之后就可以成功的转换了;也没有跨域的错了

由于项目限制,我的图片是不支持CORS访问的,所以选择了方案四解决问题

问题3: 生成的图片不完整

截图不完整是因为我将该图片进行了旋转,解决方案就是:

第一步: 给该图片元素添加一个正方形的父元素

给足空间,保证该图片元素在旋转都在这个容器内

第二步: 一般情况步骤一就可以解决问题了,但我在设置了第一步之后图片还是不完整

经排查发现子元素图片有设置 overflow: hidden;(因为taro在img节点外包裹了一层 taro-image-core节点 小程序),需要将overflow: hidden改成 overflow: visible 问题就解决了

Taro h5代码:

let node = document.querySelector('#html2canvas-dom');
html2canvas(element, {useCORS: true,scale: window.devicePixelRatio < 3 ? window.devicePixelRatio : 2,width: node?.clientWidth || canvasOption.width,height: node?.clientHeight || canvasOption.height
}).then(canvas => {// imgUrl 是图片的 base64格式const imgurl = canvas.toDataURL('image/png');Taro.uploadFile({url: '***',filePath: imgurl,name: 'file',header: {'X-Auth-Token': '****'},formData: {method: 'POST',fileType: 'png'},success: res => {// ...}});
});

参考
html2canvas 采坑记录
html2canvas跨域
html2canvas截图如何解决跨域
dom从旋转html2canvas截取图片

使用html2canvas,将页面转换成图片的采坑记录(Web/Taro h5)相关推荐

  1. html页面转换成图片的三种方法——canvas、dom-to-image、html2canvas

    html页面转换成图片的三种方法--canvas.dom-to-image.html2canvas canvas绘制网络图片报错(跨域) 使用canvas将html页面转成图片 dom-to-imag ...

  2. vue 签署文件两张图合并成一张图 h5页面转换成图片并长按保存在本地

    在做让用户在页面签名并把当前页面保存为图片,附上完整代码 (直接复制代码,更改接口地址或删除接口逻辑可直接复用) **准备工作:安装   npm install vue-esign --save 全局 ...

  3. 使用 html2canvas 将页面保存成图片

    有时我们需要实现在浏览器端直接对整个或部分页面进行截屏,比如移动端常见的"长按网页保存为图片"功能.这个借助 html2canvas 这个第三方 js 库即可实现,下面通过样例演示 ...

  4. 网页div转换成图片导出——html2canvas

    [html] view plaincopy <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ...

  5. html2canvas将html代码生成canvas转换成图片,并且保存到本地

    html2canvas将html代码生成canvas转换成图片,并且保存到本地 html2canvas 将html转换成canvas展示 convertCanvasToImage 从canvas提取为 ...

  6. jquery将html转为pdf文件,HTML+CSS入门 jsPDF插件实现将HTML页面转换成PDF详解

    本篇教程介绍了HTML+CSS入门 jsPDF插件实现将HTML页面转换成PDF详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门. < 1.目的:在前段是 jQuery库 或 ...

  7. echart转换成pdf js_【jsPDF】jsPDF插件实现将html页面转换成PDF,并下载,支持分页...

    1.目的:在前段是 jQuery库 或者 VUE库 或者两者混合库,将html 页面和数据 转换成PDF格式并下载,支持分页 1.项目背景: 对客户报修记录进行分类统计,并生成各种饼图.柱状图.线性图 ...

  8. 使用的是html5的canvas将文字转换成图片

    当前功能的运用场景是:用户需要传文件给他人,在用户选择文件之后需要显示一个文件图标和所选文件的名称. 当前代码部分是摘自网上,但是已经忘记在什么地方获取的,如有侵权联系小弟后自当删除. 注意:必须在h ...

  9. 微信小程序中base64转换成图片;uni-app小程序base64转图片;微信小程序base64文件转图片;微信小程序base64图片转图片

    将微信小程序的图片转成base64 点击此链接看另一篇 以下是将后端返回的base64转成图片: 方法1:使用微信小程序自带方法 //把base64转换成图片getBase64ImageUrl: (b ...

最新文章

  1. linux内核组件分析之--设备驱动模型之bus
  2. 12月16日课程安排
  3. 无线服务器密码让别人改了,wifi密码被改了怎么办_wifi密码被别人改了怎么办?-192路由网...
  4. php 安装xdebug扩展
  5. 使用bootstrap-table插件
  6. .net remoting与web service的区别
  7. android 开发 切图,Android开发,切图网站推荐。
  8. 判断拐点的条件_专业的交易者如何捕捉振荡区间的双向拐点。上篇
  9. 开源项目源代码阅读清单
  10. java连接达梦数据库_java连接达梦数据库的简单代码
  11. netstat 的详解
  12. java cximage_图像处理库比较 OpenCV CxImage ImageMagick CImg FreeImage
  13. 《统计学》第八版贾俊平第八章假设检验知识点总结及课后习题答案
  14. 【目标流畅阅读文献】kick off
  15. Duckduckgo搜索引擎
  16. 大家好,欢迎您加入这个集体!
  17. 如何建立有效的激励机制
  18. CPM、CPC、CPA、CPS、CPL、CPR 是什么意思 -解析互联网广告术语
  19. html设置弹性盒子分配自适应比例,移动端弹性布局flex,CSS3自适应
  20. 相关系数-excel-CORREL()

热门文章

  1. 如何增加3d渲染的逼真感?提高3d渲染真实感的技巧
  2. 网页水印插件 --- gwm.js
  3. 使用c++开发web后端接口
  4. (2)Android常见界面布局
  5. 说说ESXi虚拟交换机和端口组的“混杂模式”
  6. Linux errno详解
  7. 【oracle】user_cons_columns表中position的具体含义
  8. android项目:手机防盗软件
  9. 【PTS】OFDM中PAPR抑制算法PTS的matlab仿真
  10. UNet基于deepstream部署