实际上,我认为有一种简单的方法可以实现这一目标.我需要的是纯alpha值信息.为了测试,我有一个50 x 55 px的PNG,在每个边缘,一个5x5像素的矩形是完全透明的.在这些领域中的α必须是0.Everywhere否则它必须是255我做了非常肯定我的PNG正确创建的,它看起来也正常.
请告诉我这是否在理论上是正确的:我创建了一个只有alpha通道的CGImageRef,没有别的.这是通过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
alpha组件本身永远不会被预乘:你会把它乘以什么?的颜色分量预乘由所述α.
由于预乘颜色值很简单,因为:
r = (r * a) / 255; g = (g * a) / 255; b = (b * a) / 255;
反过来会是:
if (a > 0) { r = (r * 255) / a; g = (g * 255) / a; b = (b * 255) / a; }