只是在理论:如何在预乘alpha分量到iPhone OS的PNG的其他组件,以及它如何妥善unpremultiplied?
-
22-08-2019 - |
题
其实,我认为会有一个简单的方法来实现这一目标。我需要的是纯alpha值信息。为了测试,我有一个50×55像素PNG,其中在每个边沿的5×5像素的矩形是完全透明的。在这些领域中的α必须是0.Everywhere否则它必须是255我做了非常肯定我的PNG正确创建的,它看起来也正常。
请告诉我,如果这是理论上是正确的: 我创建一个只具有Alpha通道和任何其他的CGImageRef。这与CGBitmapContextCreate和kCGImageAlphaOnly做的PARAM。 CGBitmapContextGetBitsPerPixel(上下文)返回箱,因此它表示我,我确实具有每像素只有一个组件:所需的alpha值。 我一直在阅读这CGBitmapContextCreate将处理来自给定图像到新创建的上下文所有的转换。我的形象是以前PNG-24透明度,但从Xcode中pngcrunch似乎他们莫名其妙地转换。
所以,仅仅在理论上:我有什么机会得到正确的,unpremultiplied阿尔法在这一点?我得到的价值观似乎差不多的比赛,但在大的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);
此工作,因为该源颜色分量已经由“预乘”阿尔法分量-故名相乘。它并不需要现在就乘他们,因为已经有了结果。
unpremultiplied阿尔法
在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;
}
这表现公式是不正确的。的目标是找到非多路复用(R,G,B)中要后者的结果为相同的值复用(这是不可能找到原始R,G,B值,虽然。
但是与表现公式以上我们找到的示例
alpha = 100
r_premulti = 1
一重建的R = 2;
后期如果此r被再次多路复用,我们发现2 * 100/255 = 0,但我们想r_premulti == 1代替!!
在正确表现公式需要四舍五入。例如,对于R成分:
reconstruced r = ceiling(r_premulti * 255 / alpha)