如何从UIColor对象获得红绿蓝(RGB)和alpha背面?

Rah*_*yas 54 iphone rgb cocoa-touch objective-c uicolor

我从这个方法返回一个UIColor:

- (UIColor *)getUserSelectedColor {   
    return [UIColor colorWithRed:redSlider.value green:greenSlider.value blue:blueSlider.value alpha:1.0];
}
Run Code Online (Sandbox Code Playgroud)

得到这样的颜色:

UIColor *selectedColor = [(ColorPickerView *)alertView getUserSelectedColor];
Run Code Online (Sandbox Code Playgroud)

现在我想从selectedColor获得红色,绿色,蓝色,以便使用这些值.我想要0到1之间的值.

Pey*_*loW 114

访问时崩溃的原因SelectedColor.CGColor可能是您没有保留结果getColor,也许您需要的是:

SelectedColor = [[(ColorPickerView *)alertView getColor] retain];
Run Code Online (Sandbox Code Playgroud)

您只能UIColor使用RGB颜色空间获取RGB颜色分量,因为您使用的颜色colorWithRed:green:blue:alpha:不是问题,但如果您的代码发生变化,则可能会有所不同.

有了这个想法,让颜色组件变得非常简单:

const CGFloat* components = CGColorGetComponents(SelectedColor.CGColor);
NSLog(@"Red: %f", components[0]);
NSLog(@"Green: %f", components[1]); 
NSLog(@"Blue: %f", components[2]);
NSLog(@"Alpha: %f", CGColorGetAlpha(SelectedColor.CGColor));
Run Code Online (Sandbox Code Playgroud)


Wil*_*ter 23

该解决方案适用于非RGB颜色,例如黑色或白色.

UIColor *color = [UIColor blackColor];
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0;
// iOS 5
if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
     [color getRed:&red green:&green blue:&blue alpha:&alpha];
} else {
     // < iOS 5
     const CGFloat *components = CGColorGetComponents(color.CGColor);
     red = components[0];
     green = components[1];
     blue = components[2];
     alpha = components[3];
}

// This is a non-RGB color
if(CGColorGetNumberOfComponents(color.CGColor) == 2) {
    CGFloat hue;
    CGFloat saturation;
    CGFloat brightness;
    [color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];

}
Run Code Online (Sandbox Code Playgroud)


Axe*_*min 10

有一个 Swift 扩展:)

extension UIColor {

    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        var red: CGFloat = 0.0
        var green: CGFloat = 0.0
        var blue: CGFloat = 0.0
        var alpha: CGFloat = 0.0
        getRed(&red, green: &green, blue: &blue, alpha: &alpha)

        return (red: red, green: green, blue: blue, alpha: alpha)
    }

    var redComponent: CGFloat {
        var red: CGFloat = 0.0
        getRed(&red, green: nil, blue: nil, alpha: nil)

        return red
    }

    var greenComponent: CGFloat {
        var green: CGFloat = 0.0
        getRed(nil, green: &green, blue: nil, alpha: nil)

        return green
    }

    var blueComponent: CGFloat {
        var blue: CGFloat = 0.0
        getRed(nil, green: nil, blue: &blue, alpha: nil)

        return blue
    }

    var alphaComponent: CGFloat {
        var alpha: CGFloat = 0.0
        getRed(nil, green: nil, blue: nil, alpha: &alpha)

        return alpha
    }
}
Run Code Online (Sandbox Code Playgroud)

它与 Swift 4.2 兼容,也适用于 2 个组件颜色,如黑色、灰色等。您可以像这样访问特定的运河:

myColor.rgba.blue
Run Code Online (Sandbox Code Playgroud)

或者,它的等价物:

myColor.blueComponent
Run Code Online (Sandbox Code Playgroud)


Dan*_*ark 8

在大多数情况下,这将起作用,除非转换为RGB不起作用.

float red, green, blue, alpha;
BOOL conversionToRGBWentOk = [color getRed:&red green:&green blue:&blue alpha:&alpha];
Run Code Online (Sandbox Code Playgroud)

事实上,这就是这些方法的用途.如果conversionToRGBWentOkNO,你将有一个问题,虽然.