Wie erhalte ich RGB-Werte von UIColor?

99

Ich erstelle ein Farbobjekt mit dem folgenden Code.

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

Wie kann ich RGB-Werte vom erstellten Farbobjekt abrufen?

defmech
quelle
Mögliches Duplikat von Extrahieren von RGB aus UIColor
Roddy
5
Nur eine Anmerkung, die an die Methode übergebenen Parameter -initWithHue: Sättigung: Helligkeit: Alpha: sollten alle zwischen 0,0 und 1,0 liegen.
Geekinit

Antworten:

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

Diese Links enthalten weitere Details:

codelogic
quelle
Die Antwort unten sollte ein Kommentar gewesen sein. Hoppla.
Defmech
17
Hinweis: Dies funktioniert nur für Farben im RGB-Bereich. Dies funktioniert beispielsweise unter [UIColor whiteColor] nicht, da dies nicht in RGB erfolgt.
Jason
2
Ich habe einen Beispielcode in dieser Frage gepostet, damit dies in Nicht-RGB-Kontexten funktioniert
Jesse Rusak
4
Wenn jemand ein Problem damit findet, wie man Werte erhält colors, kann man so etwas schreiben wie:CGFloat red = colors[0];
Hemang
error: <EXPR>:3:1: error: 'CGColorGetComponents' has been replaced by property 'CGColor.components'
pkamb
119

In iOS 5 können Sie Folgendes verwenden:

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];
Teetotum
quelle
Dies wird nur in iOS 5.0 oder neuer unterstützt.
Jon Trauntvein
3
Seien Sie gewarnt, dass diese Methode nur erfolgreich ist, wenn sich die Startfarbe in einem "kompatiblen Farbraum" befindet, der je nach Gerät / Betriebssystem variieren kann. Zum Beispiel habe ich gerade festgestellt, dass das Aufrufen von [UIColor darkGrayColor] auf einem iPad 2 mit iOS 7 fehlschlägt. Die gleiche Farbe funktioniert jedoch auch auf einem iPad Air mit iOS 8.
devios1
@ devios1 Dies kann wahrscheinlich gelöst werden, indem man zuerst die Farbe serialisiert und dann deserialisiert, indem NSKeyedArchiverman wie folgt vorgeht :multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]];
Albert Renshaw
40

SWIFT 3 & 4

Ich habe festgestellt, dass cgColor.components nicht immer 4 Farbwerte zurückgibt, daher habe ich dies geändert, damit sie von einem CIColor-Wrapper abgerufen werden

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] }
}

Es ist nicht der effizienteste Weg, daher würde ich diesen nicht verwenden, wenn eine Ansicht ständig neu gezeichnet wird.

David Rees
quelle
11

Hoffentlich wird dies hilfreich sein

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
quelle
7

Habe gerade eine Kategorie dafür gemacht.

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

Geht so etwas wie:

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

Teil eppz!kitmit mehr UIColor Goodies .

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

Vielen Dank. Ich musste das constam Anfang der Zeile hinzufügen , da es eine Warnung erzeugte.

defmech
quelle
Hat es nicht eine Warnung für den Versuch generiert, CGFloat implizit in Float umzuwandeln? :)
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
quelle
2

Swift 3 Version von David Rees Antwort:

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
quelle
2

Sie können CIColor-Komponenten verwenden (Swift 5).

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

Dies funktioniert auch für Nicht-RGB-Farbräume

Mari
quelle
1

Seit iOS 2.0 gibt es eine private Instanzmethode auf UIColorgenannt , styleStringdie ein RGB- oder RGBA - String Darstellung der Farbe zurückkehrt, auch für Farben wie whiteColor außerhalb des RGB - Raum.

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

In Swift können Sie einen Bridging-Header verwenden, um die Schnittstelle verfügbar zu machen. Mit reinem Swift müssen Sie ein @objcProtokoll mit der privaten Methode und unsafeBitCast UIColormit dem Protokoll erstellen :

@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
quelle
1

Die am häufigsten gewählte Antwort ist veraltet:

Fehler :: 3: 1: Fehler: 'CGColorGetComponents' wurde durch die Eigenschaft 'CGColor.components' ersetzt.

Verwenden Sie stattdessen

myUIColor.cgColor.components

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

Ich wollte die Hintergrundfarbe der UITableViewStyle"UITableViewStyleGrouped" erhalten, also habe viewDidAppear:ich in der Methode den Code hinzugefügt:

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

Es hat getan, was ich erwartet hatte, und das Protokoll zurückgegeben:

UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1

Kurz gesagt, geben Sie einfach ein NSLog(@"%@", [UIColor whateverColor]);

Scott
quelle
0

Die Verwendung von HandyUIKit macht dies wirklich einfach :

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

Es gibt auch eine ähnliche Option, um hsbaWerte abzurufen :

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

Installieren Sie es einfach mit Karthago und los geht's.

Ich hoffe, es hilft!

Jeehut
quelle
0

Einige nützliche Makros, die ich für dieses und andere Farbsteuerelemente erstellt habe:

In Ihrem Fall würden Sie nur verwenden

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

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

Makros:

#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
quelle
-5

Stellen Sie Ihre UIColor so ein

UIColor.FromRGB(128, 179, 255)

Dies ist für Xamarin ios ... aber sicher gibt es eine Methode wie diese in Kürze.

Daniel
quelle