5

imageData を Web ワーカーに渡してから戻すコードを実行すると、Firefox は正常に動作しますが、Chrome で「Uncaught Error: DATA_CLONE_ERR: DOM Exception 25」が表示されます。

Google で検索すると、古いバージョンの Chrome が以前は機能していたことがわかりますか?

さらに確認したところ、画像データを送信する前に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
    });
}

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'});
    }

この画像データをアプリと Web ワーカーの間で送受信するには、どのような方法を使用すればよいですか?

ありがとう!

編集:

通常の配列にコピーすると、Chrome が動作し始めます...

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

そのため、chrome は CanvasPixelArray をワーカーに渡すことはできませんが、通常の配列を渡すことはできます。しかし、Firefoxはできます。

4

3 に答える 3

6

What I do is pass the entire imagedata object from the context to the worker, and not just the data:

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});

With this approach you're passing a few extra attributes to the worker (namely, the array's width and height), but I think this bit of extra data is better than the overhead associated with copying the entire data array.

于 2012-05-10T04:53:44.013 に答える
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 に答える