事实上,我认为有一个简单的方法可以实现这一目标。我需要的是纯粹的阿尔法值信息。为了进行测试,我有一个 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(使用前将#替换为@)