共计 1004 个字符,预计需要花费 3 分钟才能阅读完成。
ios 里,生成的图片不显示
canvas.toDataURL('image/jpeg', 1.0)
使用 image/jpeg 格式,在指定图片格式为 image/jpeg 或 image/webp 的情况下,可以从 0 到 1 的区间内选择图片的质量。
canvas 是弹出层时,底层有滚动条,会有部分空白
测试的时候,好奇为啥每次,生成的图片都缺一部分,而且都是从顶部开始空白,再绘制图片。
解决方案: 添加绘制坐标 y 起始位置 y: window.pageYOffset,
html2canvas(target, {
useCORS: true,
y: window.pageYOffset,
}).then(...)
ios 生成图片时显示时不显的,大图几乎不显示。
猜测是图片渲染的原因,为了确保能够生成图片,生成图片写在了所有图片加载完成之后,才进行 canvas 绘制图片功能,但是还是有渲染不出来的情况。这个搜了很久,跨域 useCORS: true
,也添加了。
Android 是没有问题的。
然后搜了很多看到这么一段话:
原因跟 html2canvas 库的工作原理有很大的关系.html2canvas 库需要我们先提供一段 DOM 节点,然后它再读取并解析这一段 DOM 节点生成 canvas 对象。如果 DOM 节点中已经使用了 <img> 标签的话,它也会解析这个 <img> 标签的 src 属性,然后重新创建一个 Image 对象,给它添加
crossOrigin="anonymous"
属性后尝试以跨域的方式重新读取图片数据。需要注意的是,一般 CDN 上的图片都是带有缓存响应头并且会在浏览器端缓存的,而且缓存的不仅仅是图片数据,还有 HTTP 响应头。所以问题的根本原因我们就找到了,当 html2canvas 尝试以跨域的方式去读取图片数据时,它读取到的是浏览器的缓存数据,而且因为我们没有给 DOM 节点中的 <img> 标签添加crossorigin="anonymous"
属性,所以缓存数据是不带 Access-Control-Allow-Origin 响应头的,进而导致 html2canvas 库读取到的图片数据污染了生成的 canvas 对象,最终致使 canvas 导出数据报错
所以我们要做的事情也很简单,就是给 DOM 节点中的每一个 <img> 标签都加上 crossorigin="anonymous"
属性就可以了。
我这边暂时搞定了,但是看网上不少人说还有问题,也可能是我测试的机型少,这个问题还是需要关注一下。