2012-01-08 8 views
5

Quando eseguo codice che riguarda imageData che viene passato a un web worker e quindi indietro, Firefox funziona perfettamente ma Chrome restituisce "Errore non rilevato: DATA_CLONE_ERR: DOM Exception 25"Web worker che si occupa di imageData che funziona con Firefox ma non Chrome

La ricerca su google suggerisce che le versioni precedenti di Chrome funzionassero?

Ho controllato un po 'di più e sembrava come se avessi bisogno di eseguire JSON.stringify e JSON.parse sul imagedata prima di inviarlo, ma poi smette di funzionare ovunque. Il codice che funziona in 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'}); 
    } 

Quale metodo dovrei usare per inviare questo imagedata avanti e indietro la app e il web worker?

Grazie!

EDIT:

Se copio ad una serie regolare, allora Chrome inizia a lavorare ...

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

Quindi Chrome non può passare un CanvasPixelArray ad un lavoratore ma si può passare una serie regolare. Ma Firefox può.

+0

http: // stackoverflow.it/questions/7506635/uncaught-error-data-clone-err-dom-exception-25-thrown-by-web-worker –

+0

oops. Grazie. Fammi provare :) – garg

+0

Non sono ancora chiaro su questo. I dati che sto passando (context.getImageData (0, 0, canvas.width, canvas.height) .data) sono un array di grandi dimensioni e non dovrebbero avere errori di riferimento circolari. Se viene convertito in JSON internamente da postMessage, allora dovrebbe solo passare attraverso gli errori. E per quanto ne so, non sto inoltrando un elemento DOM. – garg

risposta

3

Pubblicare come segue. Posso riprodurre il tuo errore nel caso in cui qualcun altro possa rispondere alla tua domanda (non posso purtroppo). Ho cercato i problemi di Chromium per vedere se si tratta di un bug in sospeso, ma non ho trovato nulla. Dato che l'elaborazione delle immagini è uno degli usi più popolari di WebWorkers, spero che qualcuno possa risponderti rapidamente.

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

da Chrome (asterischi aggiunte da me):

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. 

Da 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]. 
+0

Grazie per aver esaminato questo! Questo utilizza un codice simile: http://dylanfm.github.com/Ladderfck/ (https://github.com/garg/Ladderfck/blob/master/javascripts/app.js) e funziona bene su Chrome ma io ' Non sono sicuro del perché il mio non funzioni. Grazie ancora – garg

+0

Se copio su un normale array, Chrome inizia a funzionare – garg

+0

Contrassegnato come risposta perché il tuo commento originale era corretto ma ora capisco. Grazie per l'aiuto – garg

1

Se copio le getimagedata.data array per una serie regolare e quindi passa la matrice a un webworker, quindi Chrome inizia a funzionare.

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

Quindi Chrome non può passare un CanvasPixelArray ad un lavoratore ma si può passare una serie regolare. Ma Firefox può passare direttamente a imagedata.data.

+0

Peccato che non riesci a farlo direttamente come in FF. Forse il CanvasPixelArray di Chrome ha qualche link al DOM, o forse Chrome è semplicemente troppo cauto con i dati che permette di passare. –

5

quello che faccio è passare l'intero oggetto imagedata dal contesto al lavoratore, e non solo i dati:

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

Con questo approccio si sta passando un paio di attributi extra al lavoratore (vale a dire, la larghezza e l'altezza dell'array), ma penso che questo bit di dati extra sia migliore del sovraccarico associato alla copia dell'intero array di dati.

+2

Questa dovrebbe essere la risposta accettata. In chrome corrente (v33), il passaggio dell'intero oggetto ImageData funziona. –

Problemi correlati