有什么方法可以使用 Jquery 将 HTML Div 及其相关元素转换为画布并将画布转换为图像?我已经看过以下网站,它只会将整个 HTML 页面转换为正文。谁能帮我找出来。
2 回答
您可以通过 SVG 及其foreignObject
. 这在您无法以任何方式渲染图像或外部源的方式上受到限制(您需要提取它们并稍后单独渲染它们)。
结果:
让我们定义一些我们想要渲染的 HTML:
<div id="html">
<div style="border:2px dotted #f73;font:12px sans-serif">
<em>This</em> is
<span style="color:#00f;border:1px solid #777;padding:0 4px">HTML</span>
drawn into <strong>canvas</strong>
</div>
</div>
html
现在我们可以构建一个内联 SVG 并使用第一个 div 标签的 id添加这个 html :
var data = "<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200'>" +
"<foreignObject width='100%' height='100%'>" +
"<div xmlns='http://www.w3.org/1999/xhtml'>" +
/// extract the html content of div
document.getElementById('html').innerHTML +
"</div>" +
"</foreignObject>" +
"</svg>";
下一步是构建一个Blob
对象,以便我们可以将 SVG 作为 url 引用,以便在我们将其绘制为图像的画布中使用:
var DOMURL = self.URL || self.webkitURL || self;
var img = new Image();
var svg = new Blob([data], {type: "image/svg+xml;charset=utf-8"} );
/// create an url that we can use for the image tag
var url = DOMURL.createObjectURL(svg);
img.onload = function () {
/// now we can draw the "html" to canvas.
ctx.drawImage(img, 0, 0);
DOMURL.revokeObjectURL(url);
};
img.src = url;
您可以将其包装到一个函数中,该函数将 id 和 canvas 作为参数并处理外部内容和图像。
抱歉,浏览器不会将 HTML 渲染到画布中。
如果可以的话,这将是一个潜在的安全风险,因为 HTML 可以包含来自第三方站点的内容(特别是图像和 iframe)。如果canvas
可以将 HTML 内容转换为图像,然后您读取图像数据,您可能会从其他站点提取特权内容。
要从 HTML 中获取画布,您基本上必须使用drawImage
and从头开始编写自己的 HTML 渲染器fillText
,这可能是一项艰巨的任务。这里有一个这样的尝试,但它有点狡猾,距离完成还有很长的路要走。(它甚至尝试从头开始解析 HTML/CSS,我认为这很疯狂!从应用了样式的真实 DOM 节点开始,并使用et al读取样式getComputedStyle
和其中部分的相对位置会更容易offsetTop
.)