【问题标题】:Canvas PutImageData color loss with no/low alpha无/低 alpha 的 Canvas PutImageData 颜色丢失
【发布时间】:2011-05-04 12:18:22
【问题描述】:

有一张 3x3 的图片。 CanvasPixelArray 是:

[12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255,12,24,48,255]

我将所有像素的 alpha 更改为 0 并返回:

bobs = this.gfx.getImageData(0,0,3,3).data
for (a=3;a<bobs.data.length;a+=4)
bobs.data[a] = 0
this.gfx.putImageData(bobs,0,0)
bobs = this.gfx.getImageData(0,0,3,3).data
for (a=3;a<bobs.data.length;a+=4)
bobs.data[a] = 255
this.gfx.putImageData(bobs,0,0)

所有像素都变黑了。浏览器将颜色更改为黑色以节省内存。有没有办法防止这种情况发生或者我应该保存一个副本?

【问题讨论】:

  • 您能详细说明一下上下文吗?你需要在哪里使用这个?在jsfiddle.net 有一个具体的例子可能会很酷。

标签: javascript html canvas getimagedata


【解决方案1】:

我认为这样做的原因是 Canvas 使用预乘 alpha,这意味着所有 rgb 值都乘以这些像素的 alpha 值。这样做是为了加快 alpha 与背景等的混合。

本文中有一段关于预乘 alpha 的部分:wikipedia:Alpha_compositing

正如您所说,您可能必须保留未修改值的副本,或者可能存储图像的 alpha 值并在绘制图像之前设置 globalAlpha 属性。 (当我说图像时,您同样可以创建一个 3x3 画布,将像素存储在那里并使用 drawImage() 将其绘制到主画布上)。

【讨论】:

  • 这是一个浏览器错误,还是 HTML5 画布规范允许由于预乘 alpha 处理而导致颜色丢失?
  • 没关系,这是规范允许的,whatwg.org/specs/web-apps/current-work/multipage/…:“由于与预乘 alpha 颜色值之间的转换有损性质,可能会返回刚刚使用 putImageData() 设置的像素到一个等效的 getImageData() 作为不同的值。"
猜你喜欢
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多