Iphone CGContextClipToMask如何在内部工作?

Iphone CGContextClipToMask如何在内部工作?,iphone,ios,ipad,mask,quartz-2d,Iphone,Ios,Ipad,Mask,Quartz 2d,我正在尝试在iOS上复制CGContextClipToMask的行为,目前为止没有任何运气。有人知道CGContextClipToMask在内部是如何工作的吗?我已经阅读了文档,它说它只是将图像的alpha值乘以掩码的alpha值,这就是我在自定义函数中所做的,但是当我在CGContext上多次使用法线混合绘制结果图像时,结果会越来越暗,而使用CGContextClipToMask,结果是正确的,不会变暗 我的理论是,CGContextClipToMask除了使用图像和掩码外,还以某种方式使用了

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

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

我也读过这个问题:


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

我个人不知道
CGContextClipToMask
的内部结构,但是也许你可以通过看看它是如何在中实现的来发现一些有趣的东西

附言:

仔细想想,当你写“将图像alpha值乘以遮罩alpha值”时,我注意到了一些东西

事实上,据我所知,iOS上的掩码没有alpha通道,我所有使用alpha通道掩码的尝试都给出了错误的结果。这能让你更进一步吗

也许技巧是将图像乘以遮罩(在灰色空间中定义,并且只有一个分量),并保持图像alpha通道不变


你觉得怎么样?

我个人不知道
CGContextClipToMask
的内部结构,但也许你可以通过看看它是如何在中实现的来发现一些有趣的东西

附言:

仔细想想,当你写“将图像alpha值乘以遮罩alpha值”时,我注意到了一些东西

事实上,据我所知,iOS上的掩码没有alpha通道,我所有使用alpha通道掩码的尝试都给出了错误的结果。这能让你更进一步吗

也许技巧是将图像乘以遮罩(在灰色空间中定义,并且只有一个分量),并保持图像alpha通道不变


你觉得怎么样?

我发现了问题。当乘以掩码时,我必须对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);

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

我发现了问题。当乘以掩码时,我必须对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);

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

的GNUStep代码在这里相当无用…Sergio,没有用于该方法的代码,但它确实有关于实现如何工作的注释。有什么想法吗?事实上我不。。。果汁都在
mask()
函数中。。。再看看我的编辑。我回答了我自己的问题:)的GNUStep代码在这里是相当无用的…塞尔吉奥,这个方法没有代码,但它有关于实现如何工作的注释。有什么想法吗?事实上我不。。。果汁都在
mask()
函数中。。。再看看我的编辑。我回答了我自己的问题:)