允许 Access-Control-Allow-Origin: * in pure javascript

Allow Access-Control-Allow-Origin: * in pure javascript

所以我一直在 javascript 开发一个有趣的在线图像效果程序,用户在图像中输入 url 并点击 'enter',图像就会被绘制出来在屏幕上,然后用户可以运行对其进行一些效果,例如 g 表示灰度,b 表示模糊等。

我的问题是控制台打印出:

Redirect at origin [origin] has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

或:

Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.

我研究了这个问题的许多答案,并在我的 chrome 浏览器中添加了一个扩展程序来启用跨源资源共享,并且我的网页 运行 很好(经过几次重新加载)。

我找到的所有解决方案都需要在 chrome 中启用跨源资源共享选项,或者使用某种 php 和 ajax 调用来启用此选项。 因为我是在 jsbin 上编写代码,所以我正在专门寻找可以在 javascript, 中完成的解决方案,但我一直找不到任何解决方案那个工作。如果您对可行的事情有任何想法,或者没有可能的解决方案的消息,我们将不胜感激。

我的代码:

var background, context, image;
var docwidth, docheight;

image = new Image();
image.src = $('#image-src').val();
image.crossOrigin = "anonymous";

docwidth = $(document).outerWidth(true);
docheight = $(document).outerHeight(true);

background = document.getElementById("background");
context = background.getContext("2d");

image.onload = function() {
  background.width = docwidth;
  background.height = docheight;
  context.drawImage(image,0,0,image.width,image.height, 0, 0, docwidth, docheight);
};

function change_image_src(src) {
  image.src = $('#image-src').val();
}

// ... more image effect functions ...

function grayscale() {
  var data = context.getImageData(0, 0, background.width, background.height);
  var pixels = data.data;

  for (var x = 0; x < data.width; x++)
    for (var y = 0; y < data.height; y++) {
      var i = (y * 4) * data.width + x * 4;
      var avg = (pixels[i] + pixels[i + 1] + pixels[i + 2]) / 3;
      pixels[i] = avg;
      pixels[i + 1] = avg;
      pixels[i + 2] = avg;
    }
  context.putImageData(data, 0, 0, 0, 0, data.width, data.height);
}

$(document).keydown(function(e) {
  switch (e.which) {
    // ... other cases ...
    case 71: // g
      grayscale();
      break;
  }
});

顺便说一句,我有 image.crossOrigin = "anonymous";

提前致谢!

为了在 canvas 上使用来自另一个来源的图像而不污染它,图像必须 served with CORS headers。 This page on MDN 对此进行了解释,但本质上,当提供图像时,它必须附带一个 Access-Control-Allow-Origin header 以允许您的页面来源(可能通过 * 通配符).

除非以这种方式 提供 图片,否则将其放入 canvas 会污染它,您将无法使用 getImageData .

所以这不是 JavaScript 的事情,真的;图片的 服务方式 决定了您可以如何使用它。

我使用 CORS 代理服务器解决了这个问题:http://crossorigin.me/