本文概述
- 要求
- 怎么运行的
- 实现
- 现场例子
要求为了实现此任务, 我们将依赖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包装到< 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 = http://www.srcmini.com/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> 标记。
【如何使用JavaScript从DOM元素捕获图像】玩得开心 !
推荐阅读
- #导入MD文档图片#一步一步搭建Svn服务之windows
- 如何创建自己的JavaScript库
- 使用javascript将highcharts图表导出为图像的3种方法(客户端解决方案)
- 如何在ReactJS中创建同步和异步自动完成输入
- 如何在Django中返回JSON响应
- 如何在ReactJS中使用Bootstrap 3的组件
- 如何将Markdown渲染为纯React组件
- React Native –为什么它是移动应用程序开发的最佳选择()
- 如何使用CSS创建响应表