理论上来说:iPhone OS 中的 alpha 分量如何预乘到 PNG 的其他分量中,以及如何正确取消预乘?

2024-02-05

事实上,我认为有一个简单的方法可以实现这一目标。我需要的是纯粹的阿尔法值信息。为了进行测试,我有一个 50 x 55 像素的 PNG,其中每条边上都有一个 5x5 像素的矩形是完全透明的。在这些区域中,alpha 必须为 0。在其他地方,它必须为 255。我非常确定我的 PNG 已正确创建,而且看起来也正确。

请告诉我这在理论上是否正确: 我创建了一个 CGImageRef,它只有 alpha 通道,没有其他任何东西。这是通过 CGBitmapContextCreate 和 kCGImageAlphaOnly 作为参数来完成的。 CGBitmapContextGetBitsPerPixel(context) 返回 1,因此它表明每个像素实际上只有一个组件:所需的 alpha 值。 我一直在读到 CGBitmapContextCreate 将处理从给定图像到新创建的上下文的所有转换。我的图像以前是具有透明度的 PNG-24,但 Xcode 中的 pngcrunch 似乎以某种方式转换了它们。

所以,仅从理论上来说:此时我是否有机会获得正确的、未预乘的 alpha 值?我得到的值似乎几乎匹配,但在一个大的 5x5 透明正方形中,我得到的值包括 19、197、210、0、0、0、98 等。如果它们是真的,我就必须从图像中看到一些东西。图像本身是纯蓝色的。


预乘不会影响 Alpha 通道,它会影响颜色通道。

光栅合成(将一个光栅图像放在另一个光栅图像上)的公式是:

dst.r = src.r * src.a + dst.r * (1.0 - src.a);
dst.g = src.g * src.a + dst.g * (1.0 - src.a);
dst.b = src.b * src.a + dst.b * (1.0 - src.a);

预乘删除第一个乘法表达式:

dst.r = src.r′ + dst.r * (1.0 - src.a);
dst.g = src.g′ + dst.g * (1.0 - src.a);
dst.b = src.b′ + dst.b * (1.0 - src.a);

这是有效的,因为源颜色分量已经乘以 alpha 分量——因此得名“预乘”。现在不需要将它们相乘,因为它已经有了结果。

未预乘的阿尔法

alpha 分量本身永远不会被预乘:你会把它乘以什么?这color组件被预乘由阿尔法.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理论上来说:iPhone OS 中的 alpha 分量如何预乘到 PNG 的其他分量中,以及如何正确取消预乘? 的相关文章

随机推荐