【问题标题】:DOM Exception: SECURITY_ERR (18) when using getImageDataDOM 异常:使用 getImageData 时的 SECURITY_ERR (18)
【发布时间】:2015-07-10 10:22:43
【问题描述】:

当我从使用 png 图像切换到 SVG 时,我刚刚开始收到此错误。这些图像位于我运行此代码的同一台服务器上 -

function getLeftEdge(myImage) {
        var img = document.getElementById(myImage);
        var canvas = document.createElement('canvas');
        canvas.width = img.width;
        canvas.height = img.height;
        var context = canvas.getContext('2d');
        context.drawImage(img, 0, 0);
        var pixelData;

        for (var x = 0; x < tmp[0]; x++) {
            for (var y = 0; y < tmp[1]; y++) {
                pixelData = context.getImageData(x, y, 1, 1);

所以这不应该是一个跨域问题。我不认为。我使用 ImageMagick 创建了 SVG 图像,以在另一个域的 Linux 机器上转换 png 图像。这会以某种方式导致这种情况吗?我在 SVG 文件头中看不到任何标识其来源的内容。

我发现 http://enable-cors.org/ 是关于更改我的服务器的,但我真的很想找到一种方法来清理图像,因为程序和图像将被发送给客户使用。

有什么建议吗?

【问题讨论】:

  • &lt;img&gt; 标签是否具有从不同于主机页面的域加载的“src”属性?
  • 不,这里是 img 标签
  • 图片是来自您的域还是其他域?
  • 就像我上面说的,我在另一个域中做到了。

标签: javascript svg


【解决方案1】:

使用 SVG 文件会污染画布,无论 Chrome 和 Safari 中的域如何。

此链接可能有助于更好地解释。 http://one-day-from.blogspot.com/2013/09/svg-in-html-5-canvas-tainted-canvas.html?m=1

编辑:

我创建了一个使用 SVG 和 Canvas 的最佳场景的测试用例。我们使用内联 SVG 元素来避免任何域问题(使用来自 https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvasDrawing an svg containing html in a canvas with safari 的示例代码)

https://jsfiddle.net/ydcbw56s/4/

测试在这一行完成:

console.log(ctx.getImageData(1, 1, 1, 1));
  • Chrome 抛出错误。
  • Safari 抛出错误。
  • Firefox 获取生成的像素数据。

【讨论】:

  • 使用 SVG 不会污染 Firefox 上的画布。
  • 那么解决方法是什么?这对我来说似乎是一个大问题。 SVG 文件破坏了 javascript?
  • 您总是可以考虑将 SVG 路径转换为画布路径。我不确定这些 SVG 文件有多简单或复杂,但试试这个professorcloud.com/svg-to-canvas
【解决方案2】:

为了防止跨域图像处理(例如,这可能允许攻击者检查 CAPTCHA 图像),浏览器会跟踪图像数据的来源。如果您使用浏览器不认为您的页面应该能够“查看”的图像数据填充画布,那么它将不允许您调用 .getImageData()

正常的跨域规则适用:图像必须来自完全相同的域和端口。

【讨论】:

  • 它怎么知道这些是我在其他地方制作的?
  • 那么为什么当图像是PNG图像时这会起作用?
  • @user1601513 我不知道;这是个好问题。这不是关于图片是在哪里制作,而是关于源 URL 的位置。
猜你喜欢
  • 2011-07-27
  • 2015-09-20
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2023-04-09
  • 2019-11-11
相关资源
最近更新 更多