Веб-работник, работающий с imageData, работает с Firefox, но не с Chrome - PullRequest
5 голосов
/ 08 января 2012

Когда я запускаю код, связанный с передачей imageData веб-работнику, а затем обратно, Firefox отлично работает, но Chrome выдает «Uncaught Error: DATA_CLONE_ERR: DOM Exception 25»

Поиск в Google предполагает, что более старые версииХрома работал?

Я проверил еще немного, и мне показалось, что мне нужно запустить JSON.stringify и JSON.parse для imagedata перед его отправкой, но затем он перестает работать везде.Код, который работает в 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'});
    }

Какой метод следует использовать для отправкиэто imagedata назад и вперед приложение и веб-работник?

Спасибо!

РЕДАКТИРОВАТЬ:

Если я скопирую в обычный массив, то Chrome начнет работать ...

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

Таким образом, Chrome не может передать CanvasPixelArray работнику, но он может передать обычный массив.Но Firefox может.

Ответы [ 3 ]

5 голосов
/ 10 мая 2012

Что я делаю, это передаю весь объект 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});

При таком подходе вы передаете несколько дополнительных атрибутов работнику (а именно, ширину и высоту массива), но я думаю, что этот бит дополнительных данных лучше, чем издержки, связанные с копированием всего массива данных.

3 голосов
/ 08 января 2012

Публикация этого как продолжение. Я могу воспроизвести вашу ошибку на тот случай, если кто-то еще сможет ответить на ваш вопрос (к сожалению, я не могу). Я искал проблемы 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.

Из Firefox:

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].
1 голос
/ 09 января 2012

Если я скопирую массив getimagedata.data в обычный массив, а затем передам массив веб-работнику, Chrome начнет работать.

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

Таким образом, chrome не может передать CanvasPixelArray работнику, но он может передать обычный массив. Но Firefox может передать imagedata.data напрямую.

...