使用html2canvas,将页面转换成图片的采坑记录(Web/Taro h5)
使用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"
属性,并且给资源地址加上固定的随机数(避免缓存)
- 给html2anvas添加
useCORS:true
属性- 给要生成canvas的DOM中的每一个img标签上设置
crossorigin="anonymous"
属性- 确保你的图片CDN服务器支持CORS访问,也就是会返回
Access-Control-Allow-Origin
等响应头
在Taro中给img加上该属性之后没生效,因为
在taro中节点被把包裹了一层
taro-image-core
节点导致img属性并没有设置到img
上(所有在taro
上该方法不适用)
方案三:
使用html2canvas提供的跨域解决方案
allowTaint: true
和 useCORS: 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)相关推荐
- html页面转换成图片的三种方法——canvas、dom-to-image、html2canvas
html页面转换成图片的三种方法--canvas.dom-to-image.html2canvas canvas绘制网络图片报错(跨域) 使用canvas将html页面转成图片 dom-to-imag ...
- vue 签署文件两张图合并成一张图 h5页面转换成图片并长按保存在本地
在做让用户在页面签名并把当前页面保存为图片,附上完整代码 (直接复制代码,更改接口地址或删除接口逻辑可直接复用) **准备工作:安装 npm install vue-esign --save 全局 ...
- 使用 html2canvas 将页面保存成图片
有时我们需要实现在浏览器端直接对整个或部分页面进行截屏,比如移动端常见的"长按网页保存为图片"功能.这个借助 html2canvas 这个第三方 js 库即可实现,下面通过样例演示 ...
- 网页div转换成图片导出——html2canvas
[html] view plaincopy <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ...
- html2canvas将html代码生成canvas转换成图片,并且保存到本地
html2canvas将html代码生成canvas转换成图片,并且保存到本地 html2canvas 将html转换成canvas展示 convertCanvasToImage 从canvas提取为 ...
- jquery将html转为pdf文件,HTML+CSS入门 jsPDF插件实现将HTML页面转换成PDF详解
本篇教程介绍了HTML+CSS入门 jsPDF插件实现将HTML页面转换成PDF详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门. < 1.目的:在前段是 jQuery库 或 ...
- echart转换成pdf js_【jsPDF】jsPDF插件实现将html页面转换成PDF,并下载,支持分页...
1.目的:在前段是 jQuery库 或者 VUE库 或者两者混合库,将html 页面和数据 转换成PDF格式并下载,支持分页 1.项目背景: 对客户报修记录进行分类统计,并生成各种饼图.柱状图.线性图 ...
- 使用的是html5的canvas将文字转换成图片
当前功能的运用场景是:用户需要传文件给他人,在用户选择文件之后需要显示一个文件图标和所选文件的名称. 当前代码部分是摘自网上,但是已经忘记在什么地方获取的,如有侵权联系小弟后自当删除. 注意:必须在h ...
- 微信小程序中base64转换成图片;uni-app小程序base64转图片;微信小程序base64文件转图片;微信小程序base64图片转图片
将微信小程序的图片转成base64 点击此链接看另一篇 以下是将后端返回的base64转成图片: 方法1:使用微信小程序自带方法 //把base64转换成图片getBase64ImageUrl: (b ...
最新文章
- linux内核组件分析之--设备驱动模型之bus
- 12月16日课程安排
- 无线服务器密码让别人改了,wifi密码被改了怎么办_wifi密码被别人改了怎么办?-192路由网...
- php 安装xdebug扩展
- 使用bootstrap-table插件
- .net remoting与web service的区别
- android 开发 切图,Android开发,切图网站推荐。
- 判断拐点的条件_专业的交易者如何捕捉振荡区间的双向拐点。上篇
- 开源项目源代码阅读清单
- java连接达梦数据库_java连接达梦数据库的简单代码
- netstat 的详解
- java cximage_图像处理库比较 OpenCV CxImage ImageMagick CImg FreeImage
- 《统计学》第八版贾俊平第八章假设检验知识点总结及课后习题答案
- 【目标流畅阅读文献】kick off
- Duckduckgo搜索引擎
- 大家好,欢迎您加入这个集体!
- 如何建立有效的激励机制
- CPM、CPC、CPA、CPS、CPL、CPR 是什么意思 -解析互联网广告术语
- html设置弹性盒子分配自适应比例,移动端弹性布局flex,CSS3自适应
- 相关系数-excel-CORREL()