如何判断一张图片是否为“预乘Alpha”?

6

我听说在进行图层混合等操作时需要使用预乘alpha。那么我如何知道我的原始图像是否采用了预乘alpha呢?

2个回答

12

你不能这样做。

你唯一可以检查的是颜色是否未预乘。要做到这一点,需要遍历所有像素,并查看是否有一个颜色值高于允许的 alpha 值。 if(max(col.r,col.g,col.b) > 255*alpha)//not premul。其他情况都是模糊的,可能是预乘的,也可能不是。你最好的猜测可能是假设它们不是预乘的,因为大多数 PNG 图片都是这种情况。

编辑:实际上,即使我发布的代码也无法工作,因为有很多 PNG 图片具有白色底板,所以图像首先必须包括 alpha 值为0 的部分来确定底板颜色。


11
实际上,所有的PNG图片都没有预乘。出处:第12.8节,http://www.w3.org/TR/PNG-Rationale.html - Mark Ransom
4
很不幸,@MarkRansom,不是所有的工具都符合这个规范。 - clamp
1
@clamp 那些工具如果生成PNG输出,就会有错误。规范说明PNG文件不应该具有预乘的alpha通道。 - Mark Ransom
3
在iOS应用程序中,由Xcode创建并包含Alpha通道的所有PNG图像都使用预乘像素值。 - MoDJ
3
@MarkRansom:你错了。在预乘的RGBA中,80808000是一个有效且有意义的值,它代表了一个加法像素,这就是说预乘比直接表示更通用。在PNG中使用这种约定的软件通常会通过约定内部实现,没有人说这样的PNG必须是可互操作的,因此你不会看到规范。尽管可能有些软件会写一些专有的元数据块来表示这一点。 - Yakov Galka
显示剩余8条评论

4

Android的Bitmap存储从带有预乘alpha通道的PNG加载的图像。您不能以通常的方式从中获取未预乘原始颜色。

为了加载没有预乘RGB通道的图像,我必须使用第三方的PNGDecoder,可以在此处找到:http://twl.l33tlabs.org/#downloads


1
自API 19起,您现在可以使用Bitmap#setPremultiplied从中获取非预乘颜色。 - Darwin Huang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接