Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理图像数据的Web工作者使用Firefox而不是Chrome_Javascript_Html_Html5 Canvas_Web Worker - Fatal编程技术网

Javascript 处理图像数据的Web工作者使用Firefox而不是Chrome

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(

当我运行处理图像数据的代码,将图像数据传递给网络工作者,然后返回时,Firefox工作得很好,但Chrome给出了“未捕获错误:数据\u克隆\u错误:DOM异常25”

谷歌搜索表明,Chrome的旧版本曾经有效吗

我又检查了一些,似乎在发送imagedata之前需要在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
    });
}
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});