Chromium 不复制数组值

发布于 2024-10-06 14:06:58 字数 475 浏览 8 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

所谓喜欢 2024-10-13 14:06:58

Chrome:

> var e = document.createElement('canvas').getContext('2d').createImageData(10, 10).data;
undefined
> Object.prototype.toString.call(e)
"[object ImageData]"
> e.slice
undefined

FX4:

>>> var e = document.createElement('canvas').getContext('2d').createImageData(10, 10).data;
undefined
>>> Object.prototype.toString.call(e)
"[object Uint8ClampedArray]"
>>> e.slice
slice()

Opera:

>>> var e = document.createElement('canvas').getContext('2d').createImageData(10, 10).data;
undefined
>>> Object.prototype.toString.call(e)
"[object CanvasPixelArray]"
>>> e.slice
undefined

这告诉我们什么?那么规范无处说明 像素数据数组应该具有类似数组的方法。

因此,仅在可用时使用 .slice,否则执行 for 循环 复制,哦,还要在 2 个以上的浏览器中进行测试。

Chrome:

> var e = document.createElement('canvas').getContext('2d').createImageData(10, 10).data;
undefined
> Object.prototype.toString.call(e)
"[object ImageData]"
> e.slice
undefined

FX4:

>>> var e = document.createElement('canvas').getContext('2d').createImageData(10, 10).data;
undefined
>>> Object.prototype.toString.call(e)
"[object Uint8ClampedArray]"
>>> e.slice
slice()

Opera:

>>> var e = document.createElement('canvas').getContext('2d').createImageData(10, 10).data;
undefined
>>> Object.prototype.toString.call(e)
"[object CanvasPixelArray]"
>>> e.slice
undefined

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 a for loop copy, oh and also test in more than 2 Browsers.

爱冒险 2024-10-13 14:06:58

仅使用启动参数调用 slice 是 Spidermonkey 扩展。尝试指定开始和结束:

e.data.slice(0, e.data.length)

编辑    createImageData 返回一个 ImageData 对象,其属性是只读的。因此您无法更改数据。使用 createImageData 创建来自另一个 ImageData 对象的 CanvasRenderingContext2D 中的 ImageData 对象:

worker.onmessage = function (e) {
    ctx.createImageData(e.data);
};

Calling slice with just the start parameter is a Spidermonkey extension. Try specifying the start and end instead:

e.data.slice(0, e.data.length)

Edit    createImageData returns an ImageData object which attributes are read-only. So you can’t change data. Use createImageData to create an ImageData object in your CanvasRenderingContext2D from another ImageData object:

worker.onmessage = function (e) {
    ctx.createImageData(e.data);
};
相思故 2024-10-13 14:06:58

我认为您想使用 而不是 createImageData() getImageData()。 (这是 Mozilla 文档,但 Chrome 在上下文中也有此方法。)

Instead of createImageData(), I think you want to use getImageData(). (That's Mozilla documentation but Chrome also has this method on contexts.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文