处理imageData的Web worker使用Firefox而不是Chrome

gar*_*arg 5 javascript html5 web-worker html5-canvas

当我运行处理imageData的代码传递给web worker然后返回时,Firefox运行良好,但Chrome提供"未捕获的错误:DATA_CLONE_ERR:DOM异常25"

搜索谷歌表明旧版本的Chrome曾经有效吗?

我检查了一些,似乎我需要在发送它之前在imagedata上运行JSON.stringify和JSON.parse但它随后停止工作.在FF 9中工作的代码是:

image.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
    });
}
Run Code Online (Sandbox Code Playgroud)

worker.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'});
    }
Run Code Online (Sandbox Code Playgroud)

我应该使用什么方法来发送这个图像数据来回应用程序和Web工作者?

谢谢!

编辑:

如果我复制到常规阵列,Chrome就会开始工作......

var newImageData = [];
for (var i=0,len=myImageData.length;i<len;++i) newImageData[i] = myImageData[i];
Run Code Online (Sandbox Code Playgroud)

因此,chrome无法将CanvasPixelArray传递给worker,但它可以传递常规Array.但是firefox可以.

rod*_*ira 6

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

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});
Run Code Online (Sandbox Code Playgroud)

使用这种方法,你将一些额外的属性传递给worker(即数组的宽度和高度),但我认为这些额外的数据比复制整个数据数组的开销更好.

  • 这应该是公认的答案.在当前的chrome(v33)中,传递整个ImageData对象. (2认同)

Pau*_*ime 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.
Run Code Online (Sandbox Code Playgroud)

来自火狐:

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].
Run Code Online (Sandbox Code Playgroud)