如何将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>