JavaScript: toDataUrl() 抛出 "Security Error: Tainted canvases may not be exported."

标签 javascript html canvas svg

我有一个 HTML5 Canvas ,我可以在上面绘制来自 svg 的图像。

HTML

<canvas id="canvas" width="600" height="320"></canvas>

JavaScript

var DOMURL = window.URL || window.webkitURL || window;

var data = '<svg xmlns="http://www.w3.org/2000/svg" width="600" height="320">'+
                    '<foreignObject width="100%" height="100%">'+
                        '<style>'+
                             'foreignObject {'+
                                 'background-color: #000;'+
                                 'color: #fff'+
                                 'border-radius: 10px;'+
                             '}'+
                            'h1 {'+
                                'color: #2acabd;'+
                                'font: 25px arial;'+
                                'font-weight: bold;'+
                                'text-align: center;'+
                            '}'+
                            'h2 {'+
                                'margin: 0;'+
                                'color: #2acabd;'+
                                'font: 15px arial;'+
                            '}'+
                            'p {'+
                                'color: #fff;'+
                            '}'+
                        '</style>'+
                        '<div xmlns="http://www.w3.org/1999/xhtml" style="font-size: 40px;">'+
                            '<h1>Heading</h1>'+
                            '<div>'+
                                '<div id="details-wrapper">'+
                                    '<h2>Full Name</h2>'+
                                    '<p>Alan Johnson</p>'+

                                    '<h2>Date of Birth</h2>'+
                                    '<p>7th November 1988</p>'+

                                    '<p><span id="user-id">34329483028493284093284432</span></p>'+
                                '</div>'+
                            '</div>'+
                        '</div>'+
                    '</foreignObject>'+
                '</svg>';


var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
img = new Image();
img.setAttribute("crossOrigin", "anonymous");
var svg = new Blob([data], {type: 'image/svg+xml;charset=utf-8'});
var url = DOMURL.createObjectURL(svg);

img.onload = function() {
  ctx.drawImage(img, 0, 0);
  DOMURL.revokeObjectURL(url);
  console.log(canvas.toDataURL());
}
img.src = url;

(JS fiddle :https://jsfiddle.net/LondonAppDev/qnpcg8th/1/)

当我调用 canvas.toDataURL() 时,出现异常:

(index):98 Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

我在 Stack Overflow 上看到了与此异常相关的许多其他问题和答案。我的问题是不同的,因为(如您所见)我在任何时候都没有在我的 svg 或 Canvas 中包含来自另一个域的任何图像。

我猜问题是我正在使用 DOMURL.createObjectURL 创建一个对象 URL。

我知道在不同的浏览器中执行此操作存在一些兼容性问题,但此应用程序只需要在 Chrome 中运行。此外,将文本直接绘制到 Canvas 上不是一种选择,我必须通过 svg 来完成。

关于如何解决这个问题并成功获取我的 Canvas 的 PNG 有什么想法吗?

最佳答案

我通过将 svg 转换为数据 URL 而不是 Blob 来解决这个问题。

我删除了 var url = DOMURL.createObjectURL(svg); 并将 img.src = url; 替换为:

function buildSvgImageUrl(svg) {
    b64 = window.btoa(svg);
    return "data:image/svg+xml;base64," + b64;
}

img.src = buildSvgImageUrl(data);

现在它可以完美地工作了。

关于JavaScript: toDataUrl() 抛出 "Security Error: Tainted canvases may not be exported.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39148582/

相关文章:

javascript - React Native listView 项目删除未正确删除项目

单击时隐藏/显示的 javascript - 想再次添加单击时隐藏

javascript - 错误 403 : jquery bootstrap and css

python - Kivy 上的动画 Canvas 线

Canvas 上的Android比例缩放缩小位图

javascript - 如何移除 Canvas

javascript - 使用 jQuery 多次更改 DIV 文本

html - 第一个字母在打印媒体中显示为高于其他字母

javascript - 制作一个 float :left div sticky

javascript - HTML5 必需属性在使用 CLI 安装的 Angular 2 项目中不起作用