web前端编辑器内容-使用html2canvas获取截图,并处理一些问题

本文介绍了如何使用html2canvasAPI进行页面截图,包括解决跨域问题、处理不同设备上的分辨率差异以及移除boxShadow导致的灰色区域。重点讲解了针对阿里云OSS跨域访问的配置和html2canvas的scale属性调整。
摘要由CSDN通过智能技术生成

该用途主要是为了编辑器功能中将页面导出的功能。
html2canvas-api
为了使用html2canvas完成截图的功能,我们首先先使用一个按钮来测试一下html2canvas的截图功能。

  1. 首先在页面上创建一个img标签
<img id="test-image" :style="{ width: '300px'}"/>
  1. 创建一个button按钮,添加点击事件publish
<button @click="publish">发布</button>
const publish = () => {
  const el = document.getElementById('canvas-area') as HTMLElement;
  // 引入html2canvas, 调用html2canvas,返回一个promise对象 
  // 第二个参数是 html2canvas的options,先添加一下最终截图的宽度
  html2canvas(el, { width: 375 }).then((canvas) => {
    // 返回一个canvas Element,将该element显示到图片上面
    const image = document.getElementById('test-image') as HTMLImageElement;
    // toDataURL可以将canvas转换成一系列base64编码的图片资源内容
    image.src = canvas.toDataURL();
  });
};

第一个问题是没有背景图片了

在这里插入图片描述
这是因为我们页面上面的元素都是使用的是阿里云的oss,所以图片的地址会存在跨域的情况,htmlCanvas对于任何跨域的资源都不会做处理,所以就不会显示截图出现的背景图片。
解决方法:

// 在options里面,增加 useCORS来处理跨域请求。
html2canvas(el, { width: 375, useCORS: true })

在请求头里面:
在这里插入图片描述
当然这个配置生效的前提是要在我们阿里云oss中进行跨域请求的一些配置,否则还是不会生效的。
对象存储 --> 权限管理 --> 跨域访问

第二个问题是html2canvas获取到的截图在某些机型上面得到的宽度是750px,但是我们设置的宽度是375。

主要原因是window.devicePixelRatio的值不同
window.devicePixelRatio
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/devicePixelRatio
返回当前显示设备的物理像素分辨率与CSS像素分辨率之比。 简单来说,它告诉浏览器应使用多少屏幕实际像素来绘制单个CSS像素。

在一个标准的显示密度下,所以在标准屏幕下,devicePixelRatio 应该为 1

特例
视网膜(Retina)显示屏,它会使用更多的屏幕像素绘制相同的对象,从而获得更清晰的图像。devicePixelRatio 为 2

所以虽然我们中间的元素 css 尺寸是 375px,但是因为 Apple 是视网膜屏幕,所以使用了两倍于 css 尺寸的设备像素来渲染它,这就是最后图片尺寸为 750 px 的原因。

html2canvas 的处理

https://html2canvas.hertzen.com/configuration/ 中的 scale 属性

html2canvas(el, { width: 375, useCORS: true, scale: 1 })

第三个问题是有的区域出现了灰色黑色的区域

在这里插入图片描述
出现这个原因是因为我们在进行渲染中间画布区域的时候会带上一个boxShadow属性:
在这里插入图片描述
html2canvas是不支持boxShadow渲染的,一旦有这个属性就会出现这个问题。解决方法就是我们需要手动动态增加一些类名,然后去掉这个属性

    const canvasFix = ref(false)
    
    const publish = async () => {
      // remove select element,主要是将蓝色选中状态去掉
	  store.commit('setActive', '');
      const el = document.getElementById('canvas-area') as HTMLElement;
      canvasFix.value = true;
      // 需要等dom更新后进行截图,效果才能上去。
      await nextTick();
      html2canvas(el, { width: 375, useCORS: true, scale: 1 }).then(
        (canvas) => {
          const image = document.getElementById(
            'test-image'
          ) as HTMLImageElement;
          image.src = canvas.toDataURL();
          canvasFix.value = false;
        }
      );
    };
 // 通过canvasFix来动态增加类型,将box-shadow干掉
 .preview-list.canvas-fix .edit-wrapper > * {
 	box-shadow: none !import;
 }
JavaScript HTML renderer The script allows you to take "screenshots" of webpages or parts of it, directly on the users browser. The screenshot is based on the DOM and as such may not be 100% accurate to the real representation as it does not make an actual screenshot, but builds the screenshot based on the information available on the page. How does it work? The script renders the current page as a canvas image, by reading the DOM and the different styles applied to the elements. It does not require any rendering from the server, as the whole image is created on the clients browser. However, as it is heavily dependent on the browser, this library is not suitable to be used in nodejs. It doesn't magically circumvent any browser content policy restrictions either, so rendering cross-origin content will require a proxy to get the content to the same origin. The script is still in a very experimental state, so I don't recommend using it in a production environment nor start building applications with it yet, as there will be still major changes made. Browser compatibility The script should work fine on the following browsers: Firefox 3.5+ Google Chrome Opera 12+ IE9+ Safari 6+ As each CSS property needs to be manually built to be supported, there are a number of properties that are not yet supported. Usage Note! These instructions are for using the current dev version of 0.5, for the latest release version (0.4.1), checkout the old readme. To render an element with html2canvas, simply call: html2canvas(element[, options]); The function returns a Promise containing the <canvas> element. Simply add a promise fullfillment handler to the promise using then: html2canvas(document.body).then(function(canvas) { document.body.appendChild(canvas); }); Building The library uses grunt for building. Alternatively, you can download the latest build from here. Clone git repository with submodules: $ git clone --recursive git://github.com/niklasvh/html2canvas.git Install Grunt and uglifyjs: $ npm install -g grunt-cli uglify-js Run the full build process (including lint, qunit and webdriver tests): $ grunt Skip lint and tests and simply build from source: $ grunt build Running tests The library has two sets of tests. The first set is a number of qunit tests that check that different values parsed by browsers are correctly converted in html2canvas. To run these tests with grunt you'll need phantomjs. The other set of tests run Firefox, Chrome and Internet Explorer with webdriver. The selenium standalone server (runs on Java) is required for these tests and can be downloaded from here. They capture an actual screenshot from the test pages and compare the image to the screenshot created by html2canvas and calculate the percentage differences. These tests generally aren't expected to provide 100% matches, but while commiting changes, these should generally not go decrease from the baseline values. Start by downloading the dependencies: $ npm install Run qunit tests: $ grunt test Examples For more information and examples, please visit the homepage or try the test console. Contributing If you wish to contribute to the project, please send the pull requests to the develop branch. Before submitting any changes, try and test that the changes work with all the support browsers. If some CSS property isn't supported or is incomplete, please create appropriate tests for it as well before submitting any code changes.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值