1

到目前为止,我正在尝试在 iOS 上复制 CGContextClipToMask 的行为,但没有任何运气。有谁知道 CGContextClipToMask 在内部是如何工作的?我已经阅读了文档,它说它只是将图像 alpha 值乘以掩码 alpha 值,所以这就是我在自定义函数中所做的,但是当我使用正常混合多次绘制结果图像到 CGContext 时,结果变得越来越暗,而使用 CGContextClipToMask 结果是正确的并且不会变暗。

我的理论是 CGContextClipToMask 以某种方式使用目标上下文,除了图像和掩码来产生正确的结果,但我对核心图形的了解还不够确定。

我也读过这个问题:

如何在没有预乘 alpha 的情况下获得真正的 RGBA 或 ARGB 颜色值?

我可能会遇到这个问题,但是 CGContextClipToMask 如何解决 8 位 alpha 的精度损失问题?

4

2 回答 2

1

我发现了问题。乘以掩码时,我必须对 RGB 值进行 ceilf 调用,如下所示:

float alphaPercent = (float)maskAlpha / 255.0f;
pixelDest->A = maskAlpha;
pixelDest->R = ceilf((float)pixelDest->R * alphaPercent);
pixelDest->G = ceilf((float)pixelDest->G * alphaPercent);
pixelDest->B = ceilf((float)pixelDest->B * alphaPercent);

令人惊讶的是,这解决了这个问题......

于 2013-01-18T03:02:16.117 回答
0

CGContextClipToMask我个人不了解.

PS:

仔细想想,当你写“将图像 alpha 值乘以掩码 alpha 值”时,有一些东西引起了我的注意。

事实上,据我所知,iOS 上的蒙版没有 alpha 通道,我所有使用 alpha 通道蒙版的尝试都给出了错误的结果。这能让你走得更远一点吗?

也许诀窍是将图像乘以掩码(在灰色空间中定义,并且只有一个分量),并保持图像 alpha 通道不变......

你觉得怎么样?

于 2013-01-17T17:47:55.627 回答