Comment obtenir les valeurs RVB d'UIColor?

99

Je crée un objet couleur en utilisant le code suivant.

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

Comment puis-je récupérer les valeurs RVB de l'objet couleur créé?

defmech
la source
duplicata possible de Extracting rgb from UIColor
Roddy
5
Juste un petit mot, les paramètres passés dans la méthode -initWithHue: saturation: bright: alpha: devraient tous être compris entre 0.0 et 1.0.
geekinit le

Réponses:

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

Ces liens fournissent de plus amples détails:

codelogic
la source
La réponse ci-dessous aurait dû être un commentaire. Oups.
defmech
17
Remarque: cela ne fonctionne que pour les couleurs de l'espace RVB. Par exemple, cela ne fonctionnera pas sur [UIColor whiteColor] car ce n'est pas en RVB.
Jason
2
J'ai posté un exemple de code dans cette question pour que cela fonctionne dans des contextes non RVB: stackoverflow.com/questions/4700168/...
Jesse Rusak
4
Si quelqu'un trouve un problème sur la façon d'obtenir des valeurs colors, vous pouvez écrire quelque chose comme,CGFloat red = colors[0];
Hemang
error: <EXPR>:3:1: error: 'CGColorGetComponents' has been replaced by property 'CGColor.components'
pkamb
119

Dans iOS 5, vous pouvez utiliser:

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];
Teetotum
la source
Ceci n'est pris en charge que dans iOS 5.0 ou plus récent.
Jon Trauntvein
3
Sachez que cette méthode ne réussira que si la couleur de départ est dans «un espace colorimétrique compatible», qui peut varier en fonction de l'appareil / du système d'exploitation. Par exemple, je viens de découvrir que l'appeler sur [UIColor darkGrayColor] échouera sur un iPad 2 exécutant iOS 7. Cependant, la même couleur fonctionne bien sur un iPad Air exécutant iOS 8.
devios1
@ devios1 Cela peut probablement être résolu en sérialisant d'abord la couleur, puis en la désérialisant en utilisant NSKeyedArchiver, comme ceci:multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]];
Albert Renshaw
40

SWIFT 3 et 4

J'ai trouvé que cgColor.components ne renvoyait pas toujours 4 valeurs de couleur, j'ai donc changé cela pour qu'il les récupère à partir d'un wrapper 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] }
}

Ce n'est pas le moyen le plus efficace, donc je n'irais pas utiliser celui-ci où une vue sera constamment redessinée.

David Rees
la source
11

J'espère que cela sera utile

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);
Ashok Kumar
la source
7

Je viens de créer une catégorie pour cela.

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

Va quelque chose comme:

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

Une partie de eppz!kitavec plus de goodies UIColor .

Geri Borbás
la source
5
const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );

Merci. J'ai dû ajouter le constau début de la ligne car cela générait un avertissement.

defmech
la source
n'a-t-il pas généré un avertissement pour avoir tenté de lancer implicitement CGFloat pour qu'il flotte? :)
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];
Linh Nguyen
la source
2

La version Swift 3 de David Rees répond:

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]
    }
}
Danfordham
la source
2

Vous pouvez utiliser les composants CIColor (swift 5)

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

cela fonctionne également pour l'espace colorimétrique non RVB

Mari
la source
1

Depuis iOS 2.0, il existe une méthode d'instance privée UIColorappelée styleStringqui renvoie une représentation sous forme de chaîne RVB ou RVBA de la couleur, même pour des couleurs comme whiteColor en dehors de l'espace RVB.

Objectif c:

@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)

Dans Swift, vous pouvez utiliser un en-tête de pontage pour exposer l'interface. Avec Swift pur, vous devrez créer un @objcprotocole avec la méthode privée, et unsafeBitCast UIColoravec le protocole:

@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)
JAL
la source
1

La réponse la plus votée est obsolète:

erreur:: 3: 1: erreur: 'CGColorGetComponents' a été remplacé par la propriété 'CGColor.components'

Au lieu de cela, utilisez

myUIColor.cgColor.components

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

Je voulais obtenir la couleur d'arrière-plan de UITableViewStyle"UITableViewStyleGrouped" donc dans la viewDidAppear:méthode j'ai ajouté le code:

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

Il a fait ce que j'avais prévu et a renvoyé le journal:

UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1

Donc en bref, tapez simplement NSLog(@"%@", [UIColor whateverColor]);

Scott
la source
0

L'utilisation de HandyUIKit rend cela très simple :

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

Il existe également une option similaire pour obtenir des hsbavaleurs :

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

Installez-le simplement à l'aide de Carthage et vous êtes prêt à partir.

J'espère que ça aide!

Jeehut
la source
0

Quelques macros utiles que j'ai créées pour cela et d'autres contrôles de couleur:

Dans votre cas, vous utiliseriez simplement

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;\
})()\
)
*/
Albert Renshaw
la source
-5

réglez votre UIColor comme ceci

UIColor.FromRGB(128, 179, 255)

c'est pour Xamarin ios ... mais c'est sûr qu'il existe une méthode comme celle-ci dans swift.

Daniel
la source