【问题标题】:Export PNG from SVG on a Canvas在画布上从 SVG 导出 PNG
【发布时间】:2015-03-31 00:11:31
【问题描述】:

这是一个复杂的问题:

我的目标是获取 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() 调用之外,我已经验证了大部分都可以正常工作。我在这里错过了什么吗?有没有办法让我忽略这个工作?谢谢...

【问题讨论】:

    标签: javascript html canvas svg


    【解决方案1】:

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

    您不能再使用foreignObject hack 来抓取 html 元素。

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

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

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

    【讨论】:

    • 哇,太令人失望了。无论如何感谢您的帮助。
    • 您能否为此提供任何官方参考资料?目前这仅适用于 Chrome(webkit),您可以通过 FF 上的画布导出 SVG(有一些限制),我相信 WHATWG 已经提到解除当前对 Chrome 的限制,而不是与其他限制,但是请提供任何表明正在插入(或打算插入)的参考资料。
    • 如果你在 FF 中运行this fiddle,你可以看到没有污染。
    • @KenFyrstenberg,你的小提琴在 FF36 中运行。它是 Internet Explorer 的“开发中”(或者他们接下来想调用的任何名称):status.modern.ie/svgforeignobjectelement。小提琴不能在当前的 Chrome 中运行,尽管它确实可以在较旧的 Chrome 中运行(fex,v27) 至于 Chrome,我一直看到有关“与 foreignObject 相关的错误”的帖子,所以我不确定你的小提琴目前是否不起作用在 Chrome 中,因为他们不支持 foreignObject 或者因为他们无法让它工作。
    • @markE 不,它在 Chrome 中不起作用(但它也适用于 FF38)。我的印象是 Chromium 会取消这个限制(而不是 Mozilla 更严格),但我们必须看到我猜(离题:我仍在等待对 TextMetrics 的全面支持 - 想象一下我们是否可以在线文档编辑器的竞争对手.. 不能有那个.. ;) ).
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 2021-04-11
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2014-10-18
    相关资源
    最近更新 更多