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可以.
我所做的是将整个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(即数组的宽度和高度),但我认为这些额外的数据比复制整个数据数组的开销更好.
将此作为后续发布。我可以重现您的错误,以防其他人可以回答您的问题(不幸的是我不能)。我搜索了 Chromium 问题,看看这是否是一个突出的错误,但没有发现任何东西。鉴于图像处理是 WebWorkers 更流行的用途之一,我希望有人能够快速回答您。
来自 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)
| 归档时间: |
|
| 查看次数: |
4229 次 |
| 最近记录: |