5

当我运行处理将 imageData 传递给网络工作者然后返回的代码时,Firefox 运行良好,但 Chrome 给出“未捕获的错误:DATA_CLONE_ERR:DOM Exception 25”

搜索谷歌表明旧版本的 Chrome 曾经可以工作?

我又检查了一些,似乎我需要在发送图像数据之前对其运行 JSON.stringify 和 JSON.parse ,但随后它在任何地方都停止工作。在 FF 9 中工作的代码是:

图像.js:

var myImageData = context.getImageData(0, 0, canvas.width, canvas.height).data;
var worker = new Worker("http://direct.link/helpers/worker.js");
worker.postMessage(myImageData);  
worker.onmessage = function(event) {
  var value = event.data;
  switch (value.cmd){
    case 'last':
      //doing stuff 
      break;
  default:
      //doing stuff
    });
}

工人.js:

addEventListener('message', function(event) {
  var myImageData = event.data;
  // doing stuff.
  sendItBack(colors);
});
};

    function sendItBack(colors){
    each(colors, function(index, value){
      self.postMessage(value);
    }); 
    self.postMessage({'cmd': 'last'});
    }

为了在应用程序和网络工作者之间来回发送此图像数据,我应该使用什么方法?

谢谢!

编辑:

如果我复制到常规数组,则 Chrome 开始工作......

var newImageData = [];
for (var i=0,len=myImageData.length;i<len;++i) newImageData[i] = myImageData[i];

因此 chrome 无法将 CanvasPixelArray 传递给工作人员,但它可以传递常规数组。但是火狐可以。

4

3 回答 3

6

我所做的是将整个 imagedata 对象从上下文传递给工作人员,而不仅仅是数据:

var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);

// This works beautifully
worker.postMessage({imgData:imgData});

// But this throws the exception
worker.postMessage({imgData:imgData.data});

使用这种方法,您将一些额外的属性传递给工作人员(即数组的宽度和高度),但我认为这一点额外数据比复制整个数据数组的开销要好。

于 2012-05-10T04:53:44.013 回答
3

发布此作为跟进。如果其他人可以回答您的问题,我可以重现您的错误(不幸的是,我不能)。我已经搜索了 Chromium 问题以查看它是否是一个突出的错误,但没有找到任何东西。鉴于图像处理是 WebWorkers 更受欢迎的用途之一,我希望有人能快速回答您。

http://jsfiddle.net/gGFSJ/9/

来自 Chrome(我添加的星号):

window.URL does not exist
window.WebKitURL does not exist
using window.webkitURL for URL
window.BlobBuilder does not exist
using window.WebKitBlobBuilder for BlobBuilder
***Uncaught Error: DATA_CLONE_ERR: DOM Exception 25***
data=send back.
data=to worker.
data=send back.
data=0.

从火狐:

using window.URL for URL
window.BlobBuilder does not exist
window.WebKitBlobBuilder does not exist
window.webkitBlobBuilder does not exist
using window.MozBlobBuilder for BlobBuilder
data=send back.
data=to worker.
data=send back.
data=0.
data=send back.
data=[object Uint8ClampedArray].
于 2012-01-08T17:58:54.123 回答
1

如果我将getimagedata.data数组复制到常规数组,然后将该数组传递给 webworker,则 Chrome 开始工作。

var newImageData = [];
for (var i=0,len=myImageData.length;i<len;++i) newImageData[i] = myImageData[i];

因此 chrome 无法将CanvasPixelArray传递给工作人员,但它可以传递常规数组。但是 Firefox 可以直接传递一个imagedata.data

于 2012-01-08T22:07:30.870 回答