2012-01-08 11 views
5

Bir web çalışanına geçirilen ve ardından geri dönen imageData ile çalışan kod çalıştırdığımda, Firefox harika çalışıyor ancak Chrome "Hata Oluştu: DATA_CLONE_ERR: DOM Özel Durum 25"ImageData ile çalışan resim sunucusu Firefox ile çalışıyor ancak Chrome ile çalışma değil

Google'da arama yapmak, daha eski Chrome sürümlerinin çalışmakta olduğunu gösterir.

Biraz daha kontrol ettim ve göndermeden önce imagedata üzerinde JSON.stringify ve JSON.parse komutunu çalıştırmam gerekiyormuş gibi görünüyordu ama sonra her yerde çalışmayı durdurdu. FF 9 çalışan kod şudur:

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'}); 
    } 
ileri geri bu imageData göndermek için kullanmanız gereken hangi yöntemi

uygulama ve web çalışanı?

Teşekkürler!

DÜZENLEME:

Sonra Krom çalışmaya başlar düzenli diziye kopyalamak olursa ...

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

Yani krom bir işçiye bir CanvasPixelArray geçemez ama normal bir Diziyi geçebilir. Ama firefox yapabilir.

+0

http: // stackoverflow.com/questions/7506635/yakalanmamış hata-veri-klon-err-dom-istisnası-25-atılmış-web çalışanı –

+0

oops. Teşekkürler. Bunu deneyelim :) – garg

+0

Hala bu konuda net değilim. Geçirdiğim veriler (context.getImageData (0, 0, canvas.width, canvas.height) .data) büyük bir dizidir ve herhangi bir döngüsel başvuru hatası içermemelidir. Eğer postMessage tarafından dahili olarak JSON'a dönüştürülüyorsa, o zaman dışarıdaki hatalardan geçmelidir. Ve bildiğim kadarıyla, bir DOM öğesini yönlendirmiyorum. – garg

cevap

3

Bunu takip etme olarak izleyin. Sorunuzu cevaplayabilmesi için hatayı tekrar üretebilirim (maalesef). Olağanüstü bir hata olup olmadığını görmek için Chromium sorunlarını araştırdım, ancak hiçbir şey bulamadım. Verilen görüntü işleme, WebWorkers'ın daha popüler kullanımlarından biridir. Birilerinin size hızlı bir şekilde cevap verebileceğini umuyorum. (Yıldız tarafımdan eklenmiştir) Chrome'da

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

:

Firefox'ta
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]. 
+0

Buna dikkat ettiğiniz için teşekkür ederiz! Bu, benzer kod kullanır: http://dylanfm.github.com/Ladderfck/ (https://github.com/garg/Ladderfck/blob/master/javascripts/app.js) ve Chrome'da gayet iyi çalışıyor ama ben ' Eminim benim neden çalışmadığıma emin değilim. Tekrar teşekkürler – garg

+0

Normal bir diziye kopyaladığımda Chrome çalışmaya başlar – garg

+0

Orijinal yorumunuz doğru olduğundan, ancak şimdi anladığım için yanıt olarak işaretlendi. Yardım için teşekkürler – garg

1

Ben normal diziye getimagedata.data dizisi kopyalarsanız ve daha sonra diziyi bir web çalışanına iletin, ardından Chrome çalışmaya başlar.

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

Yani krom bir işçiye bir CanvasPixelArray geçemez ama normal bir Diziyi geçebilir. Ancak Firefox, bir imagedata.data doğrudan geçebilir. Yani (eğer işçiye birkaç ekstra özelliklerini geçiyoruz Bu yaklaşımla

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

:

+0

Utanç verici bir şekilde doğrudan FF gibi görünmüyor gibi görünmüyor. Belki de Chrome'un CanvasPixelArray'inin DOM ile bir bağlantısı vardır, ya da belki de Chrome, geçirilmesine izin verdiği verilerle aşırı derecede ihtiyatlı davranıyor. –

5

Ne yapmam sadece veri işçiye bağlamdan tüm imageData nesnesi geçmesi ve değil dizinin genişliği ve yüksekliği), ama bence bu fazladan veri, tüm veri dizisinin kopyalanmasıyla ilişkili yükten daha iyi.

+2

Bu kabul edilen cevap olmalı. Geçerli kromda (v33), tüm ImageData nesnesinin iletilmesi çalışır. –

İlgili konular