个性化阅读
专注于IT技术分析

如何使用JavaScript从DOM元素捕获图像

本文概述

尽管如果你的一个项目中不需要此功能, 你会发现此功能确实很有趣。顾名思义, 该库将以Base64格式从文档的节点生成图像或svg。是的, 每个html标签, 无论你想要什么, 都可以使用javascript渲染成图像, 而无需在任何现代浏览器上对任何服务器或任何东西创建外部调用。

要求

为了实现此任务, 我们将依赖dom-to-image Javascript库。 Dom-to-image是一个库, 可以将任意DOM节点转换为用JavaScript编写的矢量(SVG)或光栅(PNG或JPEG)图像。它基于Paul Bakaus的domvas进行了完全重写, 已修复了一些错误, 并添加了一些新功能(如Web字体和图像支持)。

你可以使用NPM获取脚本:

npm install dom-to-image

或仅在官方Github存储库中下载.zip文件(或导航)。

怎么运行的

该库使用SVG的功能, 该功能允许在<foreignObject>标记内包含任意HTML内容。因此, 为了为你呈现该DOM节点, 请执行以下步骤:

以递归方式克隆原始DOM节点。

计算节点和每个子节点的样式, 然后将其复制到相应的克隆中, 不要忘记重新创建伪元素, 因为它们不会以任何方式克隆。

嵌入网络字体:

  • 找到所有可能表示网络字体的@ font-face声明

  • 解析文件URL, 下载相应文件

  • base64编码并将内联内容作为数据:URL

  • 连接所有已处理的CSS规则, 并将它们放入一个<style>元素中, 然后将其附加到克隆中

嵌入图片:

  • 在<img>元素中嵌入图像URL

  • 背景CSS属性中使用的嵌入式图像, 其方式类似于字体

将克隆的节点序列化为XML。

将XML包装到<foreignObject>标记中, 然后包装到SVG中, 然后使其成为数据URL。

(可选)要以Uint8Array的形式获取PNG内容或原始像素数据, 请创建一个以SVG为源的Image元素, 并将其呈现在你还创建的屏幕外画布上, 然后从画布中读取内容。

实现

所有顶级功能都接受DOM节点和呈现选项, 并返回诺言, 这些诺言通过相应的数据URL来实现。

PNG元素

要创建PNG图像, 请使用domtoimage.toPng方法:

<div id="my-node">
    <p>Some HTML content or images.</p>
</div>

<script>
    var node = document.getElementById('my-node');

    domtoimage.toPng(node).then(function (dataUrl) {
        var img = new Image();
        img.src = dataUrl;
        document.body.appendChild(img);
    }).catch(function (error) {
        console.error('oops, something went wrong!', error);
    });
</script>

JPEG元素

要创建JPEG图像, 请使用domtoimage.toJpeg方法:

<div id="my-node">
    <p>Some HTML content or images.</p>
</div>

<script>
    var node = document.getElementById('my-node');
    var options = {
        quality: 0.95 
    };

    domtoimage.toJpeg(node, options).then(function (dataUrl) {
        // Do something with the dataURL (data:image/jpeg;base64, i........)
    });
</script>

元素到Blob

如果需要检索Blob而不是Base64字符串, 则可以使用domtoimage.toBlob方法, 该方法从呈现的DOM中以PNG返回Blob:

<div id="my-node">
    <p>Some HTML content or images.</p>
</div>

<script>
    var node = document.getElementById('my-node');
    
    domtoimage.toBlob(node).then(function (blob) {
        window.saveAs(blob, 'my-node.png');
    });
</script>

在前面的示例中, 我们使用FileSaver插件, 该插件使你可以使用Javascript在浏览器中下载文件(从Blob)。

现场例子

尝试一下以下小提琴, 每次单击”创建”按钮时, 都会将base64图像附加到文档中。更改文本区域的内容以查看结果:

它已经在最新的Chrome和Firefox(在撰写本文时分别为49和45)上进行了测试, Chrome在大型DOM树上的性能明显更好, 这可能是由于它对SVG的性能更高, 并且它支持CSSStyleDeclaration.cssText属性。不(也将不)支持Internet Explorer, 因为它不支持SVG <foreignObject>标记。

玩得开心 !

赞(0)
未经允许不得转载:srcmini » 如何使用JavaScript从DOM元素捕获图像

评论 抢沙发

评论前必须登录!