Рендеринг HTML в Canvas / WebGL - PullRequest
11 голосов
/ 13 июня 2011

Возможно ли рендерить элементы HTML в Canvas или WebGL? (аналогично тому, как можно нарисовать текстуру элемента видео в WebGL)

Ответы [ 5 ]

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

Есть попытка, которая может выполнить работу около 80%. Не удается отобразить выпадающий список, кнопки и некоторые другие элементы, но в основном отображаются элементы со страницы.

Смотрите и скачивайте его отсюда.

http://html2canvas.hertzen.com/

также

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

4 голосов
/ 12 июня 2012

Вы также должны проверить http://robert.ocallahan.org/2011/11/drawing-dom-content-to-canvas.html

Это может вызвать ошибку безопасности в Chrome, но отлично работает в Firefox.

4 голосов
/ 29 июня 2011

Нет, в настоящее время это невозможно, пока нет.Но планируется включить эту функцию, как указано в видео из 3-го лагеря WebGL (около 6:44) .

1 голос
/ 17 марта 2017

Я просто подумал, что добавлю почему.

Это та же проблема, что и для грязных полотен и временной атаки, которая была устранена вскоре после поставки WebGL

С Canvas 2d вы можете рисовать изображения на холсте с помощью ctx.drawImage(someImage, ...); Проблема возникает из междоменных изображений. Обычно JavaScript не может прочитать пиксели внутри изображения. Он может читать пиксели внутри холста. Итак, чтобы получить пиксели из изображения, сначала вы рисуете изображение на холсте, а затем считываете пиксели с холста ctx.getImageData(...)

Это проблема безопасности для междоменных изображений (изображений из доменов, отличных от домена страницы).

Решение для canvas 2d - это момент, когда вы рисуете междоменное изображение на 2d canvas, холст которого внутренне помечен как dirty , и оба ctx.getImageData и canvas.toDataURL вызовут ошибку безопасности. 1015 *

Первоначально WebGL следовал тому же правилу. Если вы позвоните gl.texImageXXX с междоменным изображением или грязным холстом, холст webgl будет помечен как dirty и gl.readPixels, а также canvas.toDataURL не будет работать.

Умные люди отметили, что в случае с WebGL этого было недостаточно, потому что даже если вы не смогли бы вызвать gl.readPixels, вы могли бы разработать шейдер, который занимает больше времени, основываясь на цветах текстур, к которым он обращается. Используя это, вы можете определить время, необходимое для доступа к пикселям текстуры и эффективного восстановления содержимого изображения.

Решением было то, что WebGL по умолчанию не разрешает изображения с перекрестным происхождением. Вместо этого вы должны запросить разрешение CORS (совместное использование ресурсов между источниками) с другого сервера. Только если оно дает разрешение, WebGL может использовать изображение.

Хорошо, после всего этого, надеюсь, вы поймете, почему вы не можете рендерить HTML в WebGL. Если бы вы могли визуализировать HTML как холст, вы могли бы использовать вышеописанные методы для чтения содержимого этого HTML, включая встроенные фреймы и т. Д., Грязные холсты, изображения из других доменов и т. Д. ...

1 голос
/ 13 мая 2015

Используйте эту библиотеку https://github.com/PixelsCommander/HTML-GL это так же просто, как обернуть ваш контент с тегом <html-gl>.

...