CGContextClipToMask如何在内部工作?

时间:2013-01-17 17:33:27

标签: iphone ios ipad mask quartz-2d

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

我的理论是CGContextClipToMask以某种方式使用目标上下文,除了图像和掩码以产生正确的结果,但我对核心图形知之甚少。

我也读过这个问题:

How to get the real RGBA or ARGB color values without premultiplied alpha?

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

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:0)

我个人不知道CGContextClipToMask的内部结构,但也许您可以通过查看GNUStep中的实现方式来找到有趣的内容。

PS:

更多地考虑它,当你写“将图像alpha值乘以蒙版alpha值”时,有一些东西引起了我的注意。

事实上,据我所知,iOS上的面具没有alpha通道,我尝试使用alpha通道的蒙版都给出了错误的结果。这可以让你进一步移动吗?

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

这听起来对你有什么影响?