在画布上从SVG导出PNG

时间:2015-03-30 15:28:46

标签: javascript html html5 canvas svg

这是一个复杂的问题:

我的目标是获取HTML,并将其导出为PNG。我读到最好的方法是将HTML包装在SVG和foreignObject元素中,然后在HTML5 Canvas上绘制它。问题是,当我这样做时,我发现由于tainted canvas cannot be exported错误消息导致无法导出。这是我的代码:

var data = "<svg width=200 height=200>" +
            "<foreignObject width=100% height=100%>" +
            document.getElementById("textbox").innerHTML +
            "</foreignObject>" +
            "</svg>";

var serialized = new XMLSerializer().serializeToString(data.toDOM());

var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var DOMURL = window.URL || window.webkitURL || window;

var img = new Image();
var svg = new Blob([serialized], {type: 'image/svg+xml;charset=utf-8'});
var url = DOMURL.createObjectURL(svg);

img.onload = function () {
    ctx.drawImage(img, 0, 0);
    DOMURL.revokeObjectURL(url);
    window.open(canvas.toDataURL("image/png")); //this is the line with the error
}

img.src = url;

我已经验证了大部分内容正在运行,但canvas.toDataURL()调用除外。我在这里错过了什么吗?有没有办法让这个工作我忽略?感谢...

1 个答案:

答案 0 :(得分:1)

是的,SVG在现代浏览器中玷污了画布。

您无法再使用foreignObject黑客来抓取HTML元素。

现代浏览器出于非常好的安全原因堵塞了这个漏洞。

没有跨浏览器替代方案 - 再次出于非常好的安全原因。

Chrome有一个名为ScreenShot的插件,可让您抓取内容。