Obtenha o valor RGB das predefinições do UIColor

Eu meu aplicativo eu passar o valor de cor RGB para o servidor. Meu aplicativo usa valores predefinidos do UIColor, como [UIColor grayColor], [UIColor redColor]. Eu sei que posso usar o seguinte código:

const CGFloat *c = CGColorGetComponents(color.CGColor) 

mas apenas para colors que estão no espaço de cor RBG, no entanto, [UIColor grayColor] não é.

Existe alguma maneira de obter valores RGB para colors não-RBG?

Obrigado!

O UIColor possui um método que fornece os componentes RGB ( -getRed:green:blue:alpha: que funciona muito bem no iOS 7 ou superior. No iOS 6 e anterior, esse método falhará e retornará NO se a cor não estiver em um espaço de colors RGB (como acontece em [UIColor grayColor] .)

Para o iOS 6 e versões anteriores, a única maneira de fazer isso em todos os espaços de colors é criar um contexto de bitmap do Core Graphics em um espaço de colors RGB e desenhar nele com sua cor. Você pode então ler os valores RGB do bitmap resultante. Observe que isso não funcionará para determinadas colors, como colors de padrão (por exemplo, [UIColor groupTableViewBackgroundColor]), que não têm valores RGB razoáveis.

 - (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; } } 

Você pode usar algo assim:

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

Eu só sei de uma maneira correta de fazer isso – e isso é chamar CGGetColorComponents() . Eu tentei usar UIColor ‘s -getRed:green:blue:alpha , mas não funciona corretamente em colors em tons de cinza. Então, aqui está o que eu faço:

Primeiro, eu tenho uma struct simples que me permite manipular colors RGBA facilmente. Essa estrutura é útil em outros lugares para fazer todos os tipos de manipulação de colors, como correção de gama e média de cor.

 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; 

Então, eu tenho uma function que retorna uma estrutura RGBA dada uma UIColor .

 RGBA RGBAFromUIColor(UIColor *color) { return RGBAFromCGColor(color.CGColor); } 

Ele passa o UIColor da CGColor para uma function de nível inferior para fazer o trabalho pesado.

 RGBA 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; } 

Então, isso funciona muito bem para colors em tons de cinza (como UIColor.whiteColor , UIColor.blackColor , UIColor.grayColor , etc.), bem como qualquer cor vermelha / verde / azul / alfa. Não vai funcionar com colors HSB, no entanto.

Adicionando a resposta de Jesse, aqui está como preservar 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; } 

Crossposted da minha resposta para ‘Como converter colors de um espaço de cor para outro? .

Para identificar espaços de colors diferentes, você pode obter o CGColorSpaceModel do CGColorSpaceModel da cor:

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

Então você pode comparar colorSpaceModel com as constantes definidas em CoreGraphics/CGColorSpace.h . GetRed do getRed:green:blue:alpha funciona para kCGColorSpaceModelRGB , enquanto getWhite:alpha funciona para kCGColorSpaceModelMonochrome .

você pode obter o valor RGB simplesmente usando este

 UIColor *chooseColor = view.backgroundColor; CGFloat red,green,blue,alpha; [chooseColor getRed:&red green:&green blue:&blue alpha:&alpha]; 

obrigado 🙂