Can I mix two UIColor together?

后端 未结 6 1548
暖寄归人
暖寄归人 2021-01-12 05:51

I have colorA which is [UIColor blueColor], and colorB, which is [UIColor redColor]. Is this possible for me to render a [UIColor purple]

6条回答
  •  爱一瞬间的悲伤
    2021-01-12 06:47

    Inelegant, but it works:

    UIColor* blend( UIColor* c1, UIColor* c2, float alpha )
    {
        alpha = MIN( 1.f, MAX( 0.f, alpha ) );
        float beta = 1.f - alpha;
        CGFloat r1, g1, b1, a1, r2, g2, b2, a2;
        [c1 getRed:&r1 green:&g1 blue:&b1 alpha:&a1];
        [c2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2];
        CGFloat r = r1 * beta + r2 * alpha;
        CGFloat g = g1 * beta + g2 * alpha;
        CGFloat b = b1 * beta + b2 * alpha;
        return [UIColor colorWithRed:r green:g blue:b alpha:1.f];
    }
    

    More elegant:

    UIColor+Extensions.h:

    @interface UIColor (Extensions)
    
    - (UIColor*)blendWithColor:(UIColor*)color2 alpha:(CGFloat)alpha2;
    
    @end
    

    UIColor+Extensions.m:

    @implementation UIColor (Extensions)
    
    - (UIColor*)blendWithColor:(UIColor*)color2 alpha:(CGFloat)alpha2
    {
        alpha2 = MIN( 1.0, MAX( 0.0, alpha2 ) );
        CGFloat beta = 1.0 - alpha2;
        CGFloat r1, g1, b1, a1, r2, g2, b2, a2;
        [self getRed:&r1 green:&g1 blue:&b1 alpha:&a1];
        [color2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2];
        CGFloat red     = r1 * beta + r2 * alpha2;
        CGFloat green   = g1 * beta + g2 * alpha2;
        CGFloat blue    = b1 * beta + b2 * alpha2;
        CGFloat alpha   = a1 * beta + a2 * alpha2;
        return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
    }
    
    @end
    

    Swift 3/4:

    extension UIColor
    {
    func mixin(infusion:UIColor, alpha:CGFloat) -> UIColor {
        let alpha2 = min(1.0, max(0, alpha))
        let beta = 1.0 - alpha2
    
        var r1:CGFloat = 0, r2:CGFloat = 0
        var g1:CGFloat = 0, g2:CGFloat = 0
        var b1:CGFloat = 0, b2:CGFloat = 0
        var a1:CGFloat = 0, a2:CGFloat = 0
        if getRed(&r1, green: &g1, blue: &b1, alpha: &a1) &&
            infusion.getRed(&r2, green: &g2, blue: &b2, alpha: &a2)
        {
            let red     = r1 * beta + r2 * alpha2;
            let green   = g1 * beta + g2 * alpha2;
            let blue    = b1 * beta + b2 * alpha2;
            let alpha   = a1 * beta + a2 * alpha2;
            return UIColor(red: red, green: green, blue: blue, alpha: alpha)
        }
        // epique de las failuree
        return self
    }
    }
    

提交回复
热议问题