Как я могу преобразовать элемент HTML в элемент canvas? - PullRequest
48 голосов
/ 28 апреля 2010

Было бы невероятно полезно иметь возможность временно преобразовать обычный элемент в canvas. Например, скажем, у меня есть стиль div, который я хочу перевернуть. Я хочу динамически создать холст, «визуализировать» HTMLElement в холст, скрыть оригинальный элемент и анимировать холст.

Можно ли это сделать?

Ответы [ 10 ]

48 голосов
/ 22 июля 2011

Есть библиотека, которая пытается делать то, что вы говорите.

Посмотрите эти примеры и получите код

http://hertzen.com/experiments/jsfeedback/

http://html2canvas.hertzen.com/

Считывает DOM из html и выводит его на холст, не работает на некоторых, но в целом работает.

17 голосов
/ 29 апреля 2010

Извините, браузер не отображает HTML на холсте.

Это будет потенциальная угроза безопасности, если вы сможете, так как HTML может включать контент (в частности, изображения и фреймы) со сторонних сайтов. Если canvas может превратить содержимое HTML в изображение, а затем прочитать данные изображения, вы можете извлечь привилегированное содержимое с других сайтов.

Чтобы получить холст из HTML, вам нужно написать собственный HTML-рендеринг с нуля, используя drawImage и fillText, что является потенциально огромной задачей. есть одна такая попытка , но она немного хитрая и далека от завершения. (Он даже пытается разобрать HTML / CSS с нуля, что я считаю сумасшедшим! Было бы легче начать с реального узла DOM с примененными стилями и читать стили, используя getComputedStyle и относительные положения его частей используя offsetTop и др.)

8 голосов
/ 31 августа 2012

Основываясь на посте Mozdev, на который ссылается natevw, я запустил небольшой проект для рендеринга HTML на canvas в Firefox, Chrome & Safari. Так, например, вы можете просто сделать:

rasterizeHTML.drawHTML('<span class="color: green">This is HTML</span>' 
                     + '<img src="local_img.png"/>', canvas);

Исходный код и более обширный пример здесь .

7 голосов
/ 08 мая 2012

Посмотрите этот урок на MDN : https://developer.mozilla.org/en/HTML/Canvas/Drawing_DOM_objects_into_a_canvas

Альтернативная ссылка (2019): https://reference.codeproject.com/book/dom/canvas_api/drawing_dom_objects_into_a_canvas

В нем используется временное изображение SVG для включения содержимого HTML в качестве "внешнего элемента", а затем визуализация указанного изображения SVG в элемент canvas. Однако существуют значительные ограничения на то, что вы можете включить в изображение SVG. (Подробнее см. В разделе «Безопасность».)

6 голосов
/ 25 сентября 2015

Вы можете использовать библиотеку dom-to-image (я сопровождающий). Вот как вы можете подойти к вашей проблеме:

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;
});

А вот jsfiddle

5 голосов
/ 24 января 2012

Нет, извините.

Хотя в спецификации указано:

Будущая версия API 2D-контекста может предоставить способ визуализации фрагментов документов, отображаемых с использованием CSS, прямо на холст.

Который может быть как можно ближе.

Многие люди хотят заключить сделку ctx.drawArbitraryHTML/Element, но в этом нет ничего подобного.

Единственное исключение - это эксклюзивный Mozilla drawWindow, который рисует снимок содержимого окна DOM на холсте. Эта функция доступна только для кода, работающего с правами Chrome («только локальный»). Это не разрешено на обычных страницах HTML. Таким образом, вы можете использовать его для написания расширений FireFox, таких как , это делает , но это все.

3 голосов
/ 02 ноября 2010

Вы можете сэкономить преобразования, вы можете использовать CSS3 Transitions , чтобы перевернуть <div> и <ol> и любой HTML-тег, который вы хотите. Вот некоторые демонстрации с исходным кодом, которые можно увидеть и изучить: http://www.webdesignerwall.com/trends/47-amazing-css3-animation-demos/

0 голосов
/ 08 декабря 2017

следующий код можно использовать в 2 режимах, в режиме 1 сохранить HTML-код в изображение, в режиме 2 сохранить HTML-код на холсте.

этот код работает с библиотекой: https://github.com/tsayen/dom-to-image

* "id_div" - это идентификатор элемента HTML, который вы хотите преобразовать.

** "canvas_out" - это идентификатор div, который будет содержать холст так что попробуйте этот код. :

   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>

Прокомментируйте, если это работает. Comenten si les sirvio:)

0 голосов
/ 06 августа 2014
function convert() {
                    dom = document.getElementById('divname');
                    var script,
                    $this = this,
                    options = this.options,
                    runH2c = function(){
                        try {
                            var canvas =     window.html2canvas([ document.getElementById('divname') ], {
                                onrendered: function( canvas ) {

                                window.open(canvas.toDataURL());

                                }
                            });
                        } catch( e ) {
                            $this.h2cDone = true;
                            log("Error in html2canvas: " + e.message);
                        }
                    };

                    if ( window.html2canvas === undefined && script === undefined ) {
                    } else {.
                        // html2canvas already loaded, just run it then
                        runH2c();
                    }
                }
0 голосов
/ 11 июля 2013

Самое простое решение для анимации элементов DOM - это использование CSS-переходов / анимаций, но я думаю, что вы уже знаете это и пытаетесь использовать canvas для выполнения вещей, которые CSS не позволяет вам делать. А как насчет пользовательских фильтров CSS ? Вы можете преобразовать свои элементы любым мыслимым способом, если вы знаете, как писать шейдеры. Некоторые другие ссылки и не забудьте проверить лабораторию фильтров CSS .
Примечание : Как вы можете себе представить, поддержка браузера плохая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...