Chromium 不复制数组值
我正在使用 Webworker 处理来自 Canvas 的像素数组,然后将其返回 - 分配给 ImageData 数组。 Firefox 工作得很好,但 Chromium 将一个空的像素数组放入 Canvas 中。调查表明数组复制不起作用,生成的数组具有空元素。数组切片也没有帮助,只有使用 for in 遍历每个元素才有帮助,但我想知道这里有什么问题?
imgd = ctx.createImageData(w,h);
worker.onmessage = function (e) {
imgd.data = e.data;
console.log(imgd.data === e.data); // true in FF, false in Chromium
img.data = e.data.slice(0);
console.log(imgd.data); // correct in FF, empty array in Chromium
};
I'm using Webworker to process array of pixels from Canvas and after returning it back - assign to ImageData array. Firefox works great, but Chromium puts an empty pixel array to the Canvas. Investigation showed that array copying isnt working, resulting array has nulled elements. Array slicing didnt help either, only going through each element with for in helped, but I wonder what is the problem here?
imgd = ctx.createImageData(w,h);
worker.onmessage = function (e) {
imgd.data = e.data;
console.log(imgd.data === e.data); // true in FF, false in Chromium
img.data = e.data.slice(0);
console.log(imgd.data); // correct in FF, empty array in Chromium
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Chrome:
FX4:
Opera:
这告诉我们什么?那么规范无处说明 像素数据数组应该具有类似数组的方法。
因此,仅在可用时使用
.slice
,否则执行for 循环
复制,哦,还要在 2 个以上的浏览器中进行测试。Chrome:
FX4:
Opera:
That tells us what? Well the spec nowhere states that the pixel data array should have array like methods.
Ergo, only use
.slice
when available, otherwise do afor loop
copy, oh and also test in more than 2 Browsers.仅使用启动参数调用
slice
是 Spidermonkey 扩展。尝试指定开始和结束:编辑
createImageData
返回一个 ImageData 对象,其属性是只读的。因此您无法更改数据
。使用createImageData
创建来自另一个 ImageData 对象的 CanvasRenderingContext2D 中的 ImageData 对象:Calling
slice
with just the start parameter is a Spidermonkey extension. Try specifying the start and end instead:Edit
createImageData
returns an ImageData object which attributes are read-only. So you can’t changedata
. UsecreateImageData
to create an ImageData object in your CanvasRenderingContext2D from another ImageData object:我认为您想使用 而不是
createImageData()
getImageData()
。 (这是 Mozilla 文档,但 Chrome 在上下文中也有此方法。)Instead of
createImageData()
, I think you want to usegetImageData()
. (That's Mozilla documentation but Chrome also has this method on contexts.)