从UIColor预设中获取RGB值

时间:2011-01-15 14:44:17

标签: iphone objective-c uicolor cgcolorspace

我的应用程序我将RGB颜色值传递给服务器。我的应用程序使用UIColor预定义值,如[UIColor grayColor],[UIColor redColor]。我知道我可以使用以下代码:

const CGFloat *c = CGColorGetComponents(color.CGColor)

但仅适用于RBG色彩空间中的颜色,但是,[UIColor grayColor]不是。

有没有办法获得非RBG颜色的RGB值?

谢谢!

5 个答案:

答案 0 :(得分:44)

UIColor有一个方法可以为您提供在iOS 7或更高版本上运行良好的RGB组件(-getRed:green:blue:alpha:)。在iOS 6及更早版本中,如果颜色不在RGB颜色空间中(如NO那样),此方法将失败并返回[UIColor grayColor]。)

对于iOS 6及更早版本,我知道在所有颜色空间中工作的唯一方法是在RGB颜色空间中创建Core Graphics位图上下文并使用您的颜色绘制它。然后,您可以从生成的位图中读出RGB值。请注意,这不适用于某些颜色,例如图案颜色(例如[UIColor groupTableViewBackgroundColor]),它们没有合理的RGB值。

- (void)getRGBComponents:(CGFloat [3])components forColor:(UIColor *)color {
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char resultingPixel[4];
    CGContextRef context = CGBitmapContextCreate(&resultingPixel,
                                                 1,
                                                 1,
                                                 8,
                                                 4,
                                                 rgbColorSpace,
                                                 kCGImageAlphaNoneSkipLast);
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
    CGContextRelease(context);
    CGColorSpaceRelease(rgbColorSpace);

    for (int component = 0; component < 3; component++) {
        components[component] = resultingPixel[component] / 255.0f;
    }
}

您可以使用以下内容:

    CGFloat components[3];
    [self getRGBComponents:components forColor:[UIColor grayColor]];
    NSLog(@"%f %f %f", components[0], components[1], components[2]);

答案 1 :(得分:7)

我只知道一种正确的方法 - 这就是致电CGGetColorComponents()。我尝试过使用UIColor的{​​{1}},但它在灰度颜色上无效。所以这就是我的工作:

首先,我有一个简单的-getRed:green:blue:alpha,可让我轻松操控RGBA颜色。这种结构在其他地方用于进行各种颜色处理,如伽马校正和颜色平均。

struct

然后,我有一个函数,在给定typedef struct { CGFloat r; // Red component (0 <= r <= 1) CGFloat g; // Green component (0 <= g <= 1) CGFloat b; // Blue component (0 <= b <= 1) CGFloat a; // Alpha/opacity component (0 <= a <= 1) } RGBA; 的情况下返回RGBA结构。

UIColor

它将RGBA RGBAFromUIColor(UIColor *color) { return RGBAFromCGColor(color.CGColor); } 的{​​{1}}传递给较低级别​​的函数来执行繁重的工作。

UIColor

因此,这适用于灰度颜色(如CGColorRGBA RGBAFromCGColor(CGColorRef color) { RGBA rgba; CGColorSpaceRef color_space = CGColorGetColorSpace(color); CGColorSpaceModel color_space_model = CGColorSpaceGetModel(color_space); const CGFloat *color_components = CGColorGetComponents(color); int color_component_count = CGColorGetNumberOfComponents(color); switch (color_space_model) { case kCGColorSpaceModelMonochrome: { assert(color_component_count == 2); rgba = (RGBA) { .r = color_components[0], .g = color_components[0], .b = color_components[0], .a = color_components[1] }; break; } case kCGColorSpaceModelRGB: { assert(color_component_count == 4); rgba = (RGBA) { .r = color_components[0], .g = color_components[1], .b = color_components[2], .a = color_components[3] }; break; } default: { NSLog(@"Unsupported color space model %i", color_space_model); rgba = (RGBA) { 0, 0, 0, 0 }; break; } } return rgba; } UIColor.whiteColor等)以及任何红色/绿色/蓝色/ Alpha颜色。但是,它不适用于HSB颜色。

答案 2 :(得分:3)

添加到Jesse的答案,以下是如何保留alpha:

- (void)getRGBAComponents:(CGFloat [4])components forColor:(UIColor *)color {
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char resultingPixel[4] = {0};
    CGContextRef context = CGBitmapContextCreate(&resultingPixel,
                                                 1,
                                                 1,
                                                 8,
                                                 4,
                                                 rgbColorSpace,
                                                 kCGImageAlphaPremultipliedLast);
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
    CGContextRelease(context);
    CGColorSpaceRelease(rgbColorSpace);

    CGFloat a = resultingPixel[3] / 255.0;
    CGFloat unpremultiply = (a != 0.0) ? 1.0 / a / 255.0 : 0.0;
    for (int component = 0; component < 3; component++) {
        components[component] = resultingPixel[component] * unpremultiply;
    }
    components[3] = a;
}

答案 3 :(得分:1)

my answer to 'How to convert colors from one color space to another?'转发。

要识别不同的颜色空间,您可以从颜色CGColorSpaceModel获取CGColorSpaceRef

UIColor* color = some color;
CGColorSpaceRef colorSpace = CGColorGetColorSpace([color CGColor]);
CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace);

然后,您可以将colorSpaceModelCoreGraphics/CGColorSpace.h中定义的常量进行比较。 UIColor的getRed:green:blue:alpha适用于kCGColorSpaceModelRGB,而getWhite:alpha适用于kCGColorSpaceModelMonochrome

答案 4 :(得分:0)

只需使用此

即可获得RGB值
UIColor *chooseColor = view.backgroundColor;
CGFloat red,green,blue,alpha;

[chooseColor getRed:&red green:&green blue:&blue alpha:&alpha]; 

谢谢:-)