getImageData跨源错误

时间:2013-11-08 21:50:59

标签: javascript canvas html5-canvas cors

前言:我知道已经有一些关于这个主题的问题,但是它们似乎都没有提供直接的JavaScript解决方案。

所以我遇到了这个错误,我试图使用像context.getImageData()之类的东西从画布中获取像素数据,我的确切代码可以看到 here 或以下:

<canvas id="imageCanvas" width="600" height="800"></canvas>
// Load Image
var canvas = document.getElementById('imageCanvas');

var image = new Image();
image.src = 'http://emoticons.pw/emoticons/emoticon-faces-002-medium.png';
image.onload = function() {

    width=image.width;
    height=image.height;

    var context = canvas.getContext('2d');
    context.fillStyle="#024359"; // canvas background color
    context.fillRect(0, 0, width, height);
    context.drawImage(this,0,0);

    imageData = context.getImageData(0,0,width, height); // PROBLEM HERE

    context.putImageData(imageData, 0, 0);
}

我在Chrome中遇到以下错误:

  

无法从画布获取图像数据,因为画布已经存在   受到跨性别数据的污染。

然后出现安全错误。我不想更改服务器或使用奇怪的指令启动chrome。我觉得我必须在JavaScript中做些什么。

仅使用本地图像不是问题,但在尝试时,我得到了同样的错误!

我试图在没有服务器的情况下这样做,如果我把它放在我的“默认”godaddy网络服务器上,我的所有问题都解决了吗?我听说传言dropbox还可以模拟服务器足够接近吗?

2 个答案:

答案 0 :(得分:10)

如果您正在使用file://,则无法使用http://localhost(Chrome允许您覆盖此内容,但我不会推荐它)。

对于本地测试,请使用轻量级服务器,例如Mongoose,以便您使用crossOrigin作为域来测试本地网页。这样可以避免CORS出现问题。

如果您需要在不同的域上托管图像,则需要确保它们支持跨域使用。

DropBox和ImgUrl(我推荐后者仅用于图像)都支持CORS用法,但是您需要在设置源代码之前向图像添加var img = new Image; img.onload = myLoader; img.crossOrigin = ''; ///=anonymous img.src = 'http://imgur.com/....'; 属性来请求此类用法(或将其包含在HTML中)标记,如果您正在使用它):

<img src="..." alt="" crossOrigin="anonymous" />

或HTML:

{{1}}

答案 1 :(得分:0)

在设置图像对象的来源之前,请确保先放置img.setAttribute('crossOrigin', '');。就像这样:

var img = document.createElement("img");
//fix crossorigin here...
img.setAttribute('crossOrigin', '');
//after that put your source
img.src = imageSrcURL;
document.body.appendChild(img);