如何将HTML元素转换为画布元素?
能够临时将常规元素转换为如何将HTML元素转换为画布元素?,html,canvas,Html,Canvas,能够临时将常规元素转换为画布,这将非常有用。例如,假设我有一个样式化的div,我想翻转它。我想动态创建一个画布,将HTMLElement渲染到画布中,隐藏原始元素并设置画布动画 可以吗?对不起,浏览器无法将HTML呈现到画布中 如果可以,这将是一个潜在的安全风险,因为HTML可能包含来自第三方网站的内容(特别是图像和iFrame)。如果canvas可以将HTML内容转换为图像,然后读取图像数据,则可能从其他站点提取特权内容 要从HTML中获得画布,您基本上必须从头开始使用drawImage和fi
画布
,这将非常有用。例如,假设我有一个样式化的div
,我想翻转它。我想动态创建一个画布,将HTMLElement
渲染到画布中,隐藏原始元素并设置画布动画
可以吗?对不起,浏览器无法将HTML呈现到画布中 如果可以,这将是一个潜在的安全风险,因为HTML可能包含来自第三方网站的内容(特别是图像和iFrame)。如果
canvas
可以将HTML内容转换为图像,然后读取图像数据,则可能从其他站点提取特权内容
要从HTML中获得画布,您基本上必须从头开始使用
drawImage
和fillText
编写自己的HTML渲染器,这是一项潜在的艰巨任务。虽然有,但它有点不可靠,离完成还有很长的路要走。(它甚至试图从头开始解析HTML/CSS,我认为这太疯狂了!从应用了样式的真实DOM节点开始,使用getComputedStyle
读取样式,使用offsetTop
等读取部分的相对位置,会更容易些。)对不起,浏览器不会将HTML呈现到画布中
如果可以,这将是一个潜在的安全风险,因为HTML可能包含来自第三方网站的内容(特别是图像和iFrame)。如果canvas
可以将HTML内容转换为图像,然后读取图像数据,则可能从其他站点提取特权内容
要从HTML中获得画布,您基本上必须从头开始使用
drawImage
和fillText
编写自己的HTML渲染器,这是一项潜在的艰巨任务。虽然有,但它有点不可靠,离完成还有很长的路要走。(它甚至尝试从头开始解析HTML/CSS,我认为这太疯狂了!从应用了样式的真实DOM节点开始,使用getComputedStyle
读取样式,使用offsetTop
等读取部分的相对位置,会更容易些。)您可以省去这些转换,您可以使用翻转
和
以及您想要的任何HTML标记。下面是一些演示,其中包含源代码解释,您可以查看和学习:您可以省去转换,您可以使用翻转
和
以及任何您想要的HTML标记。这里有一些演示和源代码解释,可以查看和学习:有一个库,可以尝试按照您所说的做
查看此示例并获取代码
从html读取DOM并将其呈现到画布上,在某些情况下失败,但在一般情况下。有一个库尝试按照您所说的做 查看此示例并获取代码 从html读取DOM并将其呈现到画布,在某些情况下失败,但在一般情况下是失败的。没有这样的事情,抱歉 尽管规范规定: 2D上下文API的未来版本可能提供一种方法,可以直接将使用CSS呈现的文档片段呈现到画布上 这可能是你能得到的最接近的 很多人想要一个
ctx.drawArbitraryHTML/Element
类型的交易,但没有这样的内置交易
唯一的例外是Mozilla独有的drawWindow
,它将DOM窗口内容的快照绘制到画布中。此功能仅适用于使用Chrome(“仅限本地”)权限运行的代码。在普通HTML页面中不允许使用此选项。因此,您可以使用它编写FireFox扩展,如,但仅此而已。没有这样的事情,对不起
尽管规范规定:
2D上下文API的未来版本可能提供一种方法,可以直接将使用CSS呈现的文档片段呈现到画布上
这可能是你能得到的最接近的
很多人想要一个ctx.drawArbitraryHTML/Element
类型的交易,但没有这样的内置交易
唯一的例外是Mozilla独有的
drawWindow
,它将DOM窗口内容的快照绘制到画布中。此功能仅适用于使用Chrome(“仅限本地”)权限运行的代码。在普通HTML页面中不允许使用此选项。因此,您可以使用它编写FireFox扩展,如,但仅此而已。请查看有关MDN的本教程:
备用链路(2019年):
它使用一个临时的SVG图像将HTML内容作为“外来元素”包含在内,然后将所述SVG图像呈现为画布元素。但是,对于以这种方式在SVG图像中包含的内容有很大的限制。(有关详细信息,请参阅“安全性”部分。)请查看有关MDN的本教程: 备用链路(2019年):
它使用一个临时的SVG图像将HTML内容作为“外来元素”包含在内,然后将所述SVG图像呈现为画布元素。但是,对于以这种方式在SVG图像中包含的内容有很大的限制。(有关详细信息,请参阅“安全性”部分。)在natevw引用的Mozdev文章的基础上,我启动了一个小项目,在Firefox、Chrome和Safari中将HTML呈现到画布上。例如,您可以简单地执行以下操作:
rasterizeHTML.drawHTML('<span class="color: green">This is HTML</span>'
+ '<img src="local_img.png"/>', canvas);
rasterizeHTML.drawHTML('这是HTML'
+“(帆布);
源代码和更广泛的示例是。在natevw引用的Mozdev文章的基础上,我启动了一个小项目,在Firefox、Chrome和Safari中将HTML呈现到画布上。例如,您可以简单地执行以下操作:
rasterizeHTML.drawHTML('<span class="color: green">This is HTML</span>'
+ '<img src="local_img.png"/>', canvas);
rasterizeHTML.drawHTML('这是HTML'
+“(帆布);
源代码和更广泛的示例是。制作DOM元素动画的最简单解决方案是使用CSS转换/动画,但是
var parent = document.getElementById('my-node-parent');
var node = document.getElementById('my-node');
var canvas = document.createElement('canvas');
canvas.width = node.scrollWidth;
canvas.height = node.scrollHeight;
domtoimage.toPng(node).then(function (pngDataUrl) {
var img = new Image();
img.onload = function () {
var context = canvas.getContext('2d');
context.translate(canvas.width, 0);
context.scale(-1, 1);
context.drawImage(img, 0, 0);
parent.removeChild(node);
parent.appendChild(canvas);
};
img.src = pngDataUrl;
});
function Guardardiv(id_div){
var mode = 2 // default 1 (save to image), mode 2 = save to canvas
console.log("Process start");
var node = document.getElementById(id_div);
// get the div that will contain the canvas
var canvas_out = document.getElementById('canvas_out');
var canvas = document.createElement('canvas');
canvas.width = node.scrollWidth;
canvas.height = node.scrollHeight;
domtoimage.toPng(node).then(function (pngDataUrl) {
var img = new Image();
img.onload = function () {
var context = canvas.getContext('2d');
context.drawImage(img, 0, 0);
};
if (mode == 1){ // save to image
downloadURI(pngDataUrl, "salida.png");
}else if (mode == 2){ // save to canvas
img.src = pngDataUrl;
canvas_out.appendChild(img);
}
console.log("Process finish");
});
}
function downloadURI(uri, name) {
var link = document.createElement("a");
link.download = name;
link.href = uri;
document.body.appendChild(link);
link.click();
}
<html>
<head>
</script src="/dom-to-image.js"></script>
</head>
<body>
<div id="container">
All content that want to transform
</div>
<button onclick="Guardardiv('container');">Convert<button>
<!-- if use mode 2 -->
<div id="canvas_out"></div>
</html>