叠加混合模式公式?

sam*_*tte 6 drawing blending colors ios

我有2种颜色:1种动态设置,另一种颜色始终为0.5 alpha.我想计算得到的白色,就像使用叠加混合模式在动态颜色上绘制一样.

我知道Overlay结合了MultiplyScreen混合模式.

乘法混合模式的公式是:

Result Color = (Top Color) * (Bottom Color) /255
Run Code Online (Sandbox Code Playgroud)

屏幕混合模式是:

Result Color = 255 - [((255 - Top Color)*(255 - Bottom Color))/255]
Run Code Online (Sandbox Code Playgroud)

如何计算叠加混合模式的结果颜色?

是否有UIColor开箱即用的扩展类?

wil*_*lli 7

公式有两部分:

第一部分:如果下层值> 127.5,则执行以下操作 -

值单位=(255-较低层值)/127.5

最小值=较低层值 - (255-较低层值)

叠加=(上层值*值单位)+最小值

第二部分:如果下层值<127.5,则执行以下操作 -

值单位=较低层值/ 127.5

叠加=上层值*值单位

从形式上我们可以看出最终结果很大程度上取决于上层价值.如果上层值更高(更轻),则最终结果更可能更轻.

这里开始.


sam*_*tte 7

按照willi的回答,这里是移植到代码的公式:

CGFloat newComponents[4];
const CGFloat *topComponents = CGColorGetComponents([[UIColor colorWithRed:1 green:1 blue:1 alpha:1] CGColor]);
const CGFloat *components = CGColorGetComponents(self.color.CGColor);
const int n = CGColorGetNumberOfComponents(self.color.CGColor);

for(int i=0; i < n; i++) {

    if(components[i] > 0.5) {
        CGFloat value = (topComponents[i]-components[i])/0.5;
        CGFloat min = components[i]-(topComponents[i]-components[i]);
        newComponents[i] = topComponents[i]*value+min; 
    } else {
        CGFloat value = components[i]/0.5;
        newComponents[i] = topComponents[i]*value; 
    }
}

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
UIColor *resultColor = [UIColor colorWithCGColor:CGColorCreate(colorSpace, newComponents)];
CGColorSpaceRelease(colorSpace);
Run Code Online (Sandbox Code Playgroud)