只是在理论:如何在预乘alpha分量到iPhone OS的PNG的其他组件,以及它如何妥善unpremultiplied?

StackOverflow https://stackoverflow.com/questions/870690

其实,我认为会有一个简单的方法来实现这一目标。我需要的是纯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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top