Javascript 处理图像数据的Web工作者使用Firefox而不是Chrome
当我运行处理图像数据的代码,将图像数据传递给网络工作者,然后返回时,Firefox工作得很好,但Chrome给出了“未捕获错误:数据\u克隆\u错误:DOM异常25” 谷歌搜索表明,Chrome的旧版本曾经有效吗 我又检查了一些,似乎在发送imagedata之前需要在imagedata上运行JSON.stringify和JSON.parse,但之后它在任何地方都停止工作。在FF 9中工作的代码是: image.js:Javascript 处理图像数据的Web工作者使用Firefox而不是Chrome,javascript,html,html5-canvas,web-worker,Javascript,Html,Html5 Canvas,Web Worker,当我运行处理图像数据的代码,将图像数据传递给网络工作者,然后返回时,Firefox工作得很好,但Chrome给出了“未捕获错误:数据\u克隆\u错误:DOM异常25” 谷歌搜索表明,Chrome的旧版本曾经有效吗 我又检查了一些,似乎在发送imagedata之前需要在imagedata上运行JSON.stringify和JSON.parse,但之后它在任何地方都停止工作。在FF 9中工作的代码是: image.js: var myImageData = context.getImageData(
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 worker之间来回发送此图像数据
谢谢
编辑:
如果我复制到一个常规数组,Chrome就会开始工作
var newImageData = [];
for (var i=0,len=myImageData.length;i<len;++i) newImageData[i] = myImageData[i];
var newImageData=[];
对于(var i=0,len=myImageData.length;我将此作为后续发布。我可以重现您的错误,以防其他人可以回答您的问题(很遗憾,我不能).我搜索了Chromium问题,看看它是否是一个突出的bug,但没有找到任何东西。鉴于图像处理是WebWorkers最常用的用途之一,我希望有人能尽快回答您的问题
来自Chrome(我添加的星号):
来自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].
如果我将getimagedata.data数组复制到一个常规数组,然后将该数组传递给一个webworker,Chrome就会开始工作
var newImageData = [];
for (var i=0,len=myImageData.length;i<len;++i) newImageData[i] = myImageData[i];
var newImageData=[];
对于(var i=0,len=myImageData.length;i我要做的是将整个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});
使用这种方法,您将向辅助对象传递一些额外的属性(即数组的宽度和高度),但我认为这一点额外的数据比复制整个数据数组的开销要好。oops。谢谢。让我试试:)我仍然不清楚。我传递的数据(context.getImageData(0,0,canvas.width,canvas.height).data)是一个大数组,不应该有任何循环引用错误。如果它在内部通过postMessage转换为JSON,那么它应该没有错误。据我所知,我没有转发DOM元素。我也会遇到此错误,但如果我尝试传递整个ImageData对象而不是ImageData.data.Mapping对象,则不会出现此错误将vasPixelArray转换为常规数组似乎是在浪费时间。感谢您对此进行研究!这使用了类似的代码:()它在Chrome上运行得很好,但我不确定为什么我的不起作用。再次感谢你的回答,因为你最初的评论是正确的,但现在我明白了。感谢你的帮助。你似乎不能像在FF中那样直接做。也许Chrome的CanvasPixelArray与DOM有一些联系,或者Chrome只是对DOM过于谨慎它允许传递的数据。这应该是可接受的答案。在当前的chrome(v33)中,传递整个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});