Html2canvas——图片空白的几种排查解决方案

这篇具有很好参考价值的文章主要介绍了Html2canvas——图片空白的几种排查解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题:用html2canvas生成画布图片,再转成pdf。生成图片时内容结构里的图片显示空白。
解决: 首先服务器设置图片允许跨域,如阿里云腾讯云配置跨域规则。其次图片设置crossOrigin=“anonymous”,并且拿到图片地址加随机参数如 src +‘?v=’ + Math.random()防止使用缓存,再者html2canvas设置属性useCORS, allowTaint为true。

  下列文章来源该篇

 

一、工作原理

html2canvas库的工作原理并不是真正的“截图”,而是读取网页上的目标DOM节点的信息来绘制canvas,所以它并不支持所有的css属性。

二、在 img标签中加载外部图片

前提是外部图片允许跨域,需要服务器设置

以nginx为例,response-header内要存在Access-Control-Allow-Orgin:xxxx(可以是*,安全性要求比较高的可以根据主域名自定义),如果该资源所在的web-server是不支持跨域的,保存图片是不会成功的。

img标签设置跨域

当html2canvas中生成的截图中包含外部图片,那么外部图片在引入的时候就需要设置允许跨域。

另外,通过 ‘img’ 加载的图片,浏览器默认情况下会将其缓存起来,在canvas中用到图片时,就会直接使用缓存图片,不会再重新发请求。又因为浏览器本身不会有跨域问题,所以如果‘img’没有设置 crossorigin 属性,那么就会出现跨域问题,图片不能再次被复用到 canvas 上去的。

1. 'img’标签设置crossOrigin属性
<img crossOrigin="anonymous" src={imgSrc} alt="img" />

这是最简单的方法,让图片可以复用到canvas上。

2. chrome设置
<img src={imgSrc} alt="img" />

浏览器设置 disable cache,这种方法需要设置浏览器属性,不推荐。

Html2canvas——图片空白的几种排查解决方案

 

3. 使用JS加载图片
const [imgBase, setImgBase] = useState("");
<img src={imgBase} alt="img" />
  const downloadIamge = imgsrc => {
    //下载图片地址和图片名
    let image = new Image();
    // 解决跨域 Canvas 污染问题
    image.setAttribute("crossOrigin", "anonymous");
    image.onload = function() {
      let canvas = document.createElement("canvas");
      canvas.width = image.width;
      canvas.height = image.height;
      let context = canvas.getContext("2d");
      context.drawImage(image, 0, 0, image.width, image.height);
      let url = canvas.toDataURL("image/png"); //得到图片的base64编码数据
      setImgBase(url);
    };
    image.src = imgsrc;
  };

 

这种方法能避免使用图片缓存,在开发过程中,使用js方式请求图片资源,最好每一次都加个随机数,以保证源都是最新的,不走缓存。

三、在 html2canvas 中使用
 const createImg = async id => {
     const dom = document.getElementById(id);
     const config = {
          useCORS: true,
          width: dom.offsetWidth,
          height: dom.offsetHeight,
          scrollX: 0,
          scrollY: 0,
          x: 0,
          y: 0,
        };
const data = await html2canvas(dom, config).then(canvas =&gt; {
  canvas.id = "mycanvas";

  document.body.appendChild(canvas);
  const mycanvas = document.getElementById("mycanvas");
  mycanvas.style.display = "none";
  mycanvas.style.position = "fixed";
  mycanvas.style.top = "0px";
  mycanvas.style.left = "0px";
  mycanvas.style.zIndex = "9999";

  let imgData = mycanvas.toDataURL("png");
  imgData = imgData.replace(fixType("png"), "image/octet-stream");
  const file = dataURLtoFile(imgData, "poster.png");

  return file;
});

return data;
};

 

四、html2canvas设置

使用外部图片就会面临跨域的问题,html2canvas也需要设置属性。

1. 允许画布图片跨域
confit = { useCORS: true }

 

2. 允许外部图片污染画布
confit = { allowTaint: true } 

 

使用上面两种方法就可以让外部图片显示在画布上,虽然方法2可以让外部图片显示在画布上,但是却不能调用 toBlob(), toDataURL() 或 getImageData() 方法,调用它们会抛出安全错误。

五、可能出现的问题
1. html2canvas生成的图片无法显示

可能是使用缓存图片,有以下解决方法

  • 在 Chrome 的调试器中,在 network 面板中,勾选 disable cache 选项,再重新加载图片
  • 图片的访问地址加个随机数
  • 将图片url转成base64
2. html2canvas生成的图片显示空白

如果是出现了空白,那有可能是转成图片的部分出现滚动条且是在弹窗中展示,需要设置相关滚动高度。
或者有可能是dom不对,请保证dom是要截图那个元素的父元素

 const dom = document.getElementById(id);
 const config = {
    useCORS: true,
    windowHeight:modal.scrollHeight + 24 + 100,//获取y方向页面包含滚动条的高度,24和100为padding,margin
    width: dom.offsetWidth + 48,//48为padding值
    height: dom.clientHeight + 400,//可见高度+padding+margin
    y: window.pageYOffset + 100,//滚动条高度修复
    scrollX: 17
 };

 

3. ‘img’ 加上crossOrigin="anonymous"之后图片无法显示

这个有可能是浏览器缓存导致了,可以试试重新加载资源,也可以在资源的请求路径后加上时间戳重新加载。文章来源地址https://www.toymoban.com/news/detail-841778.html

六、参考
  1. 中文文档
  2. canvas.toDataURL()报错的解决方案全都在这了
  3. 一个关于image访问图片跨域的问题
  4. canvas.toDataURL()报错的解决方案全都在这了
  5. html2canvas生成图片
  6. html2canvas截图空白问题
  7. html2canvas生成pdf页面空白
  8. 基于html2canvas实现网页保存为图片及图片清晰度优化
 
 

到了这里,关于Html2canvas——图片空白的几种排查解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue前端实现将页面显示内容生成pdf文件的几种方法,html2canvas、dom-to-image、jspdf(带分页)基本使用以及介绍

    实际开发需求:vue项目中,根据数据结构生成echarts图表组件,生成带有样式的图表以后,点击下载按钮,把图表以pdf格式的文件下载到本地 实现思路:将vue界面的echarts组件生成图片,然后使用插件将生成的图片放入pdf中,再实现pdf文件的下载 涉及框架以及插件:vue、echar

    2024年01月25日
    浏览(39)
  • html2canvas 下载图片,scale、dpi处理图像模糊

    1、安装html2canvas 依赖 2、 引入html2canvas.js 3、html 4、方法,scale和dpi 解决模糊 html2canvas.js是从git上下载的: https://github.com/eKoopmans/html2canvas/tree/develop/dist 单纯下载图片方法 === 参考: 1、解决html2canvas截图模糊的问题 2、html2canvas生成图片模糊 不清楚?两种解决方法 3、html2canvas在

    2024年02月17日
    浏览(41)
  • html2canvas 截图空白 或出现toDataURL‘ on ‘HTMLCanvasElement或img标签没截下来 的所有解决办法

    1.1以下的参数是必须要有的。 2.1这两个是解决这个报错的 3.1先设置上这个参数 3.2必须在img标签上加上这个参数 3.3最重要的一步就是必须把你的图片路径变成base64格式的,不管是网络图片还是本地图片 都不管用 必须是base64格式的, 转成了base64格式会截图很慢,所以你截图的

    2024年02月10日
    浏览(46)
  • vue3中,使用html2canvas截图包含视频、图片、文字的区域

    需求:将页面中指定区域进行截图,区域中包含了图片、文字、视频。 第一步,先安装 第二步,在页面引入: 第三步,页面使用: 1)html部分: 2)js部分: 刚开始我截出的图只有文字,插图和视频部分是空白的,并没有将页面的插图和视频截进去,最终发现是 跨域 导致的

    2024年02月06日
    浏览(41)
  • 使用nginx+HTML2canvas将任意html网页转为png图片自定义张数

    本文简述如何使用nginx+html2canvas将任意网页html转为png图片 如果是本地网页,直接进行nginx反向代理就行 如果不是本地网页,需要简单利用工具转为本地网页 导入 导入,不能使用在线的库,只能下载到本地才能导入,因为会有同源限制,否则会报跨域错误。 下载导入 由于在

    2024年01月17日
    浏览(42)
  • 前端生成pdf之html2canvas+jsPDF,以及解决图片不显示bug

    开发背景: 需要给页面中相应的内容生成pdf,查找文档后发现要用到两个插件。html2canvas 以及 jsPDF html2canvas 给dom结构转化为canvas,然后生成各种类型图片 jsPDF 把canvas 生成的图片url 转化为pdf 参数 image:表示要插入的图片资源,可以是图片文件的路径或者base64编码字符串。

    2024年02月02日
    浏览(40)
  • html2Canvas+jsPDF 下载PDF 遇到跨域的对象存储的图片无法显示

        一、问题原因  对象存储的域名和你网址的域名不一样,此时用Canvas相关插件 将DOM元素转化为PDF,就会出现跨域错误。 二、解决办法  两步 1. 图片元素上设置属性  crossorigin=\\\"anonymous\\\"  支持原生img和eleme组件  2. 存储桶设置资源跨域访问 阿里腾讯云为例:↓ 阿里云OS

    2024年02月15日
    浏览(41)
  • 使用html2canvas,将页面转换成图片的图片模糊等踩坑记录(Web/Taro h5)

    使用 html2canvas 将页面转换成图片的采坑记录 1. 生成的图片很模糊 2. 生成的图片是空白 3. 生成的图片不完整 截图前是这样 截图后这样 截图后的图片图片缺省了一部分 问题1: 生成的图片很模糊(图片跨域) 方法一: 将canvas放大n倍再作图; 移动端的话,根据移动设备的 devicePixelR

    2024年02月05日
    浏览(39)
  • uniapp APP端使用html2canvas截图分享小程序卡片图片模糊、跨域等问题解决

    项目场景:uniapp  APP端,分享小程序到微信好友,使用html2canvas截取当前页面做卡片封面图。仅是需要展示部分内容用作卡片封面就可以,不强制需要全屏截图。 问题1、部分页面截取到的图片分享到微信后卡片图片模糊。 问题2、截图时报错:Failed to execute \\\'toDataURL\\\' on \\\'HTMLC

    2024年02月05日
    浏览(59)
  • html2canvas使用文档

    Install NPM Install Yarn 以 vue 举例,这样写起来比较方便 如果想要将图片导出,可以这样写 名称 默认值 描述 allowTaint false 是否允许跨源图像污染画布 backgroundColor #ffffff 画布背景色(如果在DOM中未指定),为透明设置null canvas null 用作绘图基础的现有画布元素 foreignObjectRendering

    2024年03月28日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包