¿Cómo obtener valores RGB de UIColor?


99

Estoy creando un objeto de color usando el siguiente código.

curView.backgroundColor = [[UIColor alloc] initWithHue:229 saturation:40 brightness:75 alpha:1];

¿Cómo puedo recuperar los valores RGB del objeto de color creado?


posible duplicado de Extraer rgb de UIColor
Roddy

5
Solo una nota, los parámetros pasados ​​al método -initWithHue: saturation: shine: alpha: deben estar todos entre 0.0 y 1.0.
geekinit

Respuestas:


84
const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );

Estos enlaces proporcionan más detalles:


La respuesta a continuación debería haber sido un comentario. ¡Ups!
defmech

17
Nota: esto solo funciona para colores en el espacio RGB. Por ejemplo, esto no funcionará en [UIColor whiteColor] ya que no está en RGB.
Jason

2
Publiqué un código de muestra en esta pregunta para que esto funcione en contextos que no son RGB: stackoverflow.com/questions/4700168/…
Jesse Rusak

4
Si alguien encuentra un problema sobre cómo obtener valores colors, puede escribir algo como:CGFloat red = colors[0];
Hemang

error: <EXPR>:3:1: error: 'CGColorGetComponents' has been replaced by property 'CGColor.components'
pkamb

119

En iOS 5 puedes usar:

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];

Esto solo es compatible con iOS 5.0 o posterior.
Jon Trauntvein

3
Tenga en cuenta que este método solo tendrá éxito si el color inicial está en "un espacio de color compatible", que puede variar según el dispositivo / sistema operativo. Por ejemplo, acabo de descubrir que llamar a esto en [UIColor darkGrayColor] fallará en un iPad 2 con iOS 7. Sin embargo, el mismo color funciona bien en un iPad Air con iOS 8.
devios1

@ devios1 Esto probablemente se puede resolver primero serializando el color y luego deserializándolo usando NSKeyedArchiver, así:multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]];
Albert Renshaw

40

SWIFT 3 y 4

Descubrí que cgColor.components no siempre devolvería 4 valores de color, así que cambié esto para que los obtenga de un contenedor CIColor

extension UIColor {
    var redValue: CGFloat{ return CIColor(color: self).red }
    var greenValue: CGFloat{ return CIColor(color: self).green }
    var blueValue: CGFloat{ return CIColor(color: self).blue }
    var alphaValue: CGFloat{ return CIColor(color: self).alpha }
}

SWIFT 2

extension UIColor {
    var red: CGFloat{ return CGColorGetComponents(self.CGColor)[0] }
    var green: CGFloat{ return CGColorGetComponents(self.CGColor)[1] }
    var blue: CGFloat{ return CGColorGetComponents(self.CGColor)[2] }
    var alpha: CGFloat{ return CGColorGetComponents(self.CGColor)[3] }
}

No es la forma más eficiente, por lo que no usaría esto donde una vista se volverá a dibujar constantemente.


11

Espero que esto sea de ayuda

CGFloat red, green, blue, alpha;

//Create a sample color

UIColor *redColor = [UIColor redColor];

//Call 

[redColor getRed: &red 
  green: &green
  blue: &blue 
  alpha: &alpha];
NSLog(@"red = %f. Green = %f. Blue = %f. Alpha = %f",
  red,
  green,
  blue,
  alpha);

7

Acabo de crear una categoría para esto.

NSLog(@"%f", [UIColor blueColor].blue); // 1.000000

Va algo como:

typedef enum { R, G, B, A } UIColorComponentIndices;

@implementation UIColor (EPPZKit)

-(CGFloat)red
{ return CGColorGetComponents(self.CGColor)[R]; }

-(CGFloat)green
{ return CGColorGetComponents(self.CGColor)[G]; }

-(CGFloat)blue
{ return CGColorGetComponents(self.CGColor)[B]; }

-(CGFloat)alpha
{ return CGColorGetComponents(self.CGColor)[A]; }

@end

Parte de eppz!kitcon más golosinas de UIColor .


5
const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );

Gracias. Tuve que agregar el constal comienzo de la línea ya que estaba generando una advertencia.


¿No generó una advertencia por intentar lanzar implícitamente CGFloat para flotar? :)
braden

5
 UIColor *color = [[UIColor greenColor] retain]; //line 1

//OR(You will have color variable either like line 1 or line 2)

color = curView.backgroundColor;//line 2
CGColorRef colorRef = [color CGColor];

int _countComponents = CGColorGetNumberOfComponents(colorRef);

if (_countComponents == 4) {
    const CGFloat *_components = CGColorGetComponents(colorRef);
    CGFloat red     = _components[0];
    CGFloat green = _components[1];
    CGFloat blue   = _components[2];
    CGFloat alpha = _components[3];

    NSLog(@"%f,%f,%f,%f",red,green,blue,alpha);
}

[color release];

2

La versión Swift 3 de David Rees responde:

extension UIColor {

    var redValue: CGFloat{
        return cgColor.components! [0]
    }

    var greenValue: CGFloat{
        return cgColor.components! [1]
    }

    var blueValue: CGFloat{
        return cgColor.components! [2]
    }

    var alphaValue: CGFloat{
        return cgColor.components! [3]
    }
}

2

Puede utilizar componentes CIColor (swift 5)

let ciColor = CIColor(color: backgroundColor)
let alpha = ciColor.alpha
let red = ciColor.red
let blue = ciColor.blue
let green = ciColor.green

esto también funciona para espacios de color que no son RGB


1

Desde iOS 2.0 hay un método de instancia privada en el UIColorllamado styleStringque devuelve una representación de cadena RGB o RGBA del color, incluso para colores como whiteColor fuera del espacio RGB.

C objetivo:

@interface UIColor (Private)

- (NSString *)styleString;

@end

// ...

[[UIColor whiteColor] styleString]; // rgb(255,255,255)
[[UIColor redColor] styleString]; // rgb(255,0,0)
[[UIColor lightTextColor] styleString]; // rgba(255,255,255,0.600000)

En Swift, puede usar un encabezado puente para exponer la interfaz. Con Swift puro, deberá crear un @objcprotocolo con el método privado y unsafeBitCast UIColorcon el protocolo:

@objc protocol  UIColorPrivate {
    func styleString() -> String
}

let white = UIColor.whiteColor()
let red = UIColor.redColor()
let lightTextColor = UIColor.lightTextColor()

let whitePrivate = unsafeBitCast(white, UIColorPrivate.self)
let redPrivate = unsafeBitCast(red, UIColorPrivate.self)
let lightTextColorPrivate = unsafeBitCast(lightTextColor, UIColorPrivate.self)

whitePrivate.styleString() // rgb(255,255,255)
redPrivate.styleString() // rgb(255,0,0)
lightTextColorPrivate.styleString() // rgba(255,255,255,0.600000)

1

La respuesta más votada está desactualizada:

error:: 3: 1: error: 'CGColorGetComponents' ha sido reemplazado por la propiedad 'CGColor.components'

En su lugar, use

myUIColor.cgColor.components


1
let color = myUIColor.cgColor.components let r = color! [0] let g = color! [1] let b = color! [2]
Gurjinder Singh

0

Quería obtener el color de fondo del UITableViewStyle"UITableViewStyleGrouped", así que en el viewDidAppear:método agregué el código:

NSLog(@"%@", self.tableView.backgroundView.backgroundColor);

Hizo lo que anticipé y devolvió el registro:

UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1

En resumen, escriba NSLog(@"%@", [UIColor whateverColor]);


0

Usar HandyUIKit hace que esto sea realmente fácil :

import HandyUIKit    

let color = UIColor(red: 0.1, green: 0.2, blue: 0.3, alpha: 0.4)

// get any of the rgba values
color.rgba.red    // => 0.1
color.rgba.green  // => 0.2
color.rgba.blue   // => 0.3
color.rgba.alpha  // => 0.4

También hay una opción similar para obtener hsbavalores :

let color = UIColor(hue: 0.1, saturation: 0.2, brightness: 0.3, alpha: 0.4)

// you can get any of the hsba values, too
color.hsba.hue         // => 0.1
color.hsba.saturation  // => 0.2
color.hsba.brightness  // => 0.3
color.hsba.alpha       // => 0.4

Simplemente instálelo usando Carthage y listo.

¡Espero que ayude!


0

Algunas macros útiles que hice para este y otros controles de color:

En su caso, solo usaría

getRGBA(myColor, red, green, blue, alpha);

NSLog(@"Red Value: %f", red);
NSLog(@"Blue Value: %f", green);
NSLog(@"Green Value: %f", blue);

Macros:

#define rgba(r,g,b,a) [UIColor colorWithRed:((float)(r))/255.0f green:((float)(g))/255.0f blue:((float)(b))/255.0f alpha:a]
#define rgb(r,g,b) rgba(r, g, b, 1.0f)

#define rgbaf(r,g,b,a) [UIColor colorWithRed:(r) green:(g) blue:(b) alpha:a]
#define rgbf(r,g,b) rgbaf(r, g, b, 1.0f)

#define rgba_fromColor(__color, __r, __g, __b, __a) \
CGFloat __r, __g, __b, __a;\
UIColor *__unpackedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:__color]];/*Bring system colors into compatible color-space (e.g. DarkGrayColor)*/\
[__unpackedColor getRed:&__r green:&__g blue:&__b alpha:&__a];
#define getRGBA(__color, __r, __g, __b, __a) hsba_fromColor(__color, __r, __g, __b, __a)

#define getRed(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return r;\
})()\
)

#define getGreen(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return g;\
})()\
)

#define getBlue(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return b;\
})()\
)

#define getAlpha(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return a;\
})()\
)










#define hsba(h,s,b,a) [UIColor colorWithHue:((float)(h))/360.0f saturation:((float)(s))/100.0f brightness:((float)(b))/100.0f alpha:a]
#define hsb(h,s,b) hsba(h, s, b, 1.0f)

#define hsbaf(h,s,b,a) [UIColor colorWithHue:(h) saturation:(s) brightness:(b) alpha:a]
#define hsbf(h,s,b) rgbaf(h, s, b, 1.0f)

#define hsba_fromColor(__color, __h, __s, __b, __a) \
CGFloat __h, __s, __b, __a;\
UIColor *__unpackedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:__color]];/*Bring system colors into compatible color-space (e.g. DarkGrayColor)*/\
[__unpackedColor getHue:&__h saturation:&__s brightness:&__b alpha:&__a];
#define getHSBA(__color, __h, __s, __b, __a) rgba_fromColor(__color, __h, __s, __b, __a)

#define getHue(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return h;\
})()\
)

#define getSaturation(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return s;\
})()\
)

#define getBrightness(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return b;\
})()\
)

/*
///already defined in RGBA macros
#define getAlpha(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return a;\
})()\
)
*/

-5

configura tu UIColor así

UIColor.FromRGB(128, 179, 255)

esto es para Xamarin ios ... pero seguro que hay un método como este en swift.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.