【问题标题】:How does premultiplied alpha pixels work with RGB values higher than alpha预乘 alpha 像素如何处理高于 alpha 的 RGB 值
【发布时间】:2021-05-13 17:42:37
【问题描述】:

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

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

在下图中,这显示顶部是 0x00700070,底部是 0x00ff0070,两者都是预乘的。

【问题讨论】:

    标签: graphics core-graphics


    【解决方案1】:

    给定 source(前景)、destination(背景)和 result(最终帧缓冲区值):

    对于预乘 alpha:

    green_result = green_destination * (255 - alpha_source) + green_source
    

    对于非预乘 alpha:

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

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

    一般来说,具有超过alpha_sourcegreen_source 组件的行为是未定义的。并且可能导致算术溢出。

    根据所使用的实现,您可能会发现green_result 的值可能被限制在 0-255 范围内,或者您可能会发现它只占用了和。这取决于实施。但大多数实现只会添加green_source 值,正如我上面写的公式所述,即使没有发生溢出。

    【讨论】:

    • 感谢您的回复,您说的是未定义。另一个问题是,这不会失去粒度,还是在实际绘制时无关紧要?例如,根据如何处理舍入,可以说 alpha 是 0x10,红色是 0x70,蓝色是 0x7f,当乘以抛出的余数时,它们都是 0x7,结果看起来相同(强度)。如果没有预乘,会是这样吗?
    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2011-06-30
    • 2015-12-29
    • 2018-12-24
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多