预乘 alpha 像素如何处理高于 alpha

时间:2021-05-13 17:42:37

标签: graphics core-graphics

我正在开发一个应用程序,在 Android 上我可以使用常规的 RGBA,但在 iOS 上它们只支持预乘 RGBA。 我的理解是您只需将 RGB 值乘以 alpha,因此 0xff000070(常规)之类的值将转换为 0x70000070(预乘),这将代表 100% 红色强度和 43% 遮挡的值。

那么在 0xff000070(预乘)的情况下会发生什么,这意味着 227% 的红色强度或者它是如何工作的?

在下图中,顶部为 0x00700070,底部为 0x00ff0070,两者均预乘。

Test Case

1 个答案:

答案 0 :(得分:0)

给定(前景)、目的地(背景)和结果(最终帧缓冲区值):

对于预乘 alpha:

green_result = green_destination * (255 - alpha_source) + green_source

对于非预乘 alpha:

green_result = green_destination * (255 - alpha_source) + green_source * alpha_source

很明显,正如您所注意到的,使用预乘 alpha 执行混合操作是可能的,该操作产生的 green_result 值超过 255(可以由 8 位整数表示的最大值) .

通常,green_source 组件超过 alpha_source 的行为是未定义的。并且可能会导致算术溢出。

根据所使用的实现,您可能会发现 green_result 值可能被限制到 0-255 范围内,或者您可能会发现它只需要低 8 位的总和。这取决于实现。但是大多数实现只会添加 green_source 值,正如我上面写的公式所描述的那样,即使没有发生溢出也是如此。

相关问题