html2canvas的使用

2019-11-29  本文已影响0人  yunshengz

html2canvas是什么

html2canvas 可以在浏览器端直接对整个或部分页面进行截屏。脚本通过读取DOM并将不同的样式应用到这些元素上,从而将当页面渲染成一个Canvas图片。

html2canvas怎么用

// element:要绘图的dom节点;
// options:可选参数;
html2canvas(element, options).then(function(canvas) {
    document.body.appendChild(canvas);
});

html2canvas的例子

  1. 首先定义两个使用到的方法
/* 根据window.devicePixelRatio获取像素比 */
function DPR() {
    if (window.devicePixelRatio && window.devicePixelRatio > 1) {
        return window.devicePixelRatio;
    }
    return 1;
}
/* 将传入值转为整数 */
function parseValue(value) {
    return parseInt(value, 10);
}

devicePixelRatio属性是干嘛的
window的该属性能够获取到当前显示设备物理分辨率与css的像素分辨率之间的比率。简单说就是告诉浏览器应该使用多少个物理像素来会在单个css像素。

2.绘制canvas

async function drawCanvas(selector) {
    // 获取想要转换的 DOM 节点
    const dom = document.querySelector(selector);
    const box = window.getComputedStyle(dom);
    
    // DOM 节点计算后宽高
    const width = parseValue(box.width);
    const height = parseValue(box.height);
    
    // 获取像素比
    const scaleBy = DPR();
    
    // 创建自定义 canvas 元素
    let canvas = document.createElement('canvas');
    
    // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
    canvas.width = width * scaleBy;
    canvas.height = height * scaleBy;
    
    // 设定 canvas css宽高为 DOM 节点宽高
    canvas.style.width = `${width}px`;
    canvas.style.height = `${height}px`;
    
    // 获取画笔
    const context = canvas.getContext('2d');
    
    // 将所有绘制内容放大像素比倍
    context.scale(scaleBy, scaleBy);
    let x = width;
    let y = height;
    
    return await html2canvas(dom, {
        useCORS:true // 配置这个可以用cors跨域使用服务器图片
    }).then(function() {
        // 绘制的图片就是canvas;在这里可以对canvas进行你所需要的操作
    });
}

关于在配置项中设置跨域
useCORS和allowTaint两种都可以设置跨域;
为什么要设置跨域:我们图片一般都是放到静态资源服务器上的,资源服务器地址一般和项目地址是不一样的;虽然图片可以在页面上显示,但是用canvas绘图时却绘制不出来;

3.清晰度优化(canvas图片转base64显示)

经过上面的步骤就可以绘制出canvas图片了,但是查看实际图片时会发现,图片部分绘制是没问题的,但是文字部分就模糊了;因此还需对绘制出来的canvas做进一步处理

/* 图片转base64格式 */
function convertCanvasToImage(canvas, x, y) {
    let image = new Image();

    image.crossOrigin = 'anonymous';
    image.width = x;
    image.height = y;
    image.style="display: block;";
    image.src = canvas.toDataURL('image/png');
    return image
}

4.其他

canvas绘制图片的dom元素部分最好定义宽高,不然单纯靠子元素撑开的话,绘图的时候可能会绘制不完整

参考文档

html2canvas的官方地址:html2canvas.hertzen.com
devicePixelRatio的文档地址://developer.mozilla.org/zh-CN/docs/Web/API/Window/devicePixelRatio

上一篇下一篇

猜你喜欢

热点阅读