2009-05-03 15 views
79

Gesehen das vor gefragt, aber mein Beispiel scheint nicht zu funktionieren.Extrahieren von RGB aus UIColor

const CGFloat *toCol = CGColorGetComponents([[UIColor greenColor] CGColor]); 

Das Array ist leer, wenn man es mit GDB betrachtet. Irgendwelche Hinweise?

Antwort

108

Das von Ihnen bereitgestellte Codebeispiel sollte funktionieren.

Try this:

UIColor uicolor = [[UIColor greenColor] retain]; 
CGColorRef color = [uicolor CGColor]; 

int numComponents = CGColorGetNumberOfComponents(color); 

if (numComponents == 4) 
{ 
    const CGFloat *components = CGColorGetComponents(color); 
    CGFloat red = components[0]; 
    CGFloat green = components[1]; 
    CGFloat blue = components[2]; 
    CGFloat alpha = components[3]; 
} 

[uicolor release]; 
+0

OK wird dies in einem Moment versuchen, danke –

+0

Warum ist "behalten" hier erforderlich? Auch kann ich nur scheinen, um 2 (nicht 4) Komponenten zu bekommen. – Susanna

+5

FYI, Susanna, Graustufenfarben zeigen sich als nur 2 Komponenten. – davidcann

1

Kasse uicolor-utilities. Scheint wie eine sehr gute Bibliothek, um dies und viele andere nützliche Dinge mit UIColor zu tun. Zum Beispiel mit dieser Bibliothek Sie schreiben konnte:

CGFloat red = [myColor red]; 
7

Verwenden Sie einfach Memcpy:

CGColorRef tmpColor = [[currentColorView backgroundColor] CGColor]; 
CGFloat newComponents[4] = {}; 
memcpy(newComponents, CGColorGetComponents(tmpColor), sizeof(newComponents)); 
// now newComponents is filled with tmpColor rgba data 
+0

Wird getestet, wenn es in Ordnung ist, ist es die einfachste Lösung und nicht so komplex zu verstehen – htafoya

+0

Ich habe es in meiner iOS-App verwendet und es funktioniert. Kann keinen Grund sehen, diesen Ansatz nicht verwenden – Realexer

38

In iOS 5 könnten Sie verwenden:

UIColor *color = [UIColor orangeColor]; 
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; 

if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { 
    [color getRed:&red green:&green blue:&blue alpha:&alpha]; 
} else { 
    const CGFloat *components = CGColorGetComponents(color.CGColor); 
    red = components[0]; 
    green = components[1]; 
    blue = components[2]; 
    alpha = components[3]; 
} 
+1

In MonoTouch (Xamarin): 'color.GetRGBA (out rot, out grün, out blau, out alpha);' –

14

Hier ist eine Allround-Lösung, die auch dauert Nicht-RGB-Farben berücksichtigen z [UIColor blackColor]

UIColor *color = [UIColor blackColor]; 
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; 
// iOS 5 
if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { 
    [color getRed:&red green:&green blue:&blue alpha:&alpha]; 
} else { 
    // < iOS 5 
    const CGFloat *components = CGColorGetComponents(color.CGColor); 
    red = components[0]; 
    green = components[1]; 
    blue = components[2]; 
    alpha = components[3]; 
} 

// This is a non-RGB color 
if(CGColorGetNumberOfComponents(color.CGColor) == 2) { 
    CGFloat hue; 
    CGFloat saturation; 
    CGFloat brightness; 
    [color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]; 

} 
5

Danke für die Richtung Willster. Für alle, die Graustufenfarbe verwenden (erstellt mit colorWithWhite:alpha:), können Sie im folgenden Codebeispiel den Weißwert ermitteln (die HSV-Methode funktioniert nicht für Farben, die auf diese Weise erstellt wurden).

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0, white = 0.0; 

// This is a non-RGB color 
if(CGColorGetNumberOfComponents(self.color.CGColor) == 2) { 
    [self.color getWhite:&white alpha:&alpha]; 
} 
else { 
    // iOS 5 
    if ([self.color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { 
     [self.color getRed:&red green:&green blue:&blue alpha:&alpha]; 
    } else { 
     // < iOS 5 
     const CGFloat *components = CGColorGetComponents(self.color.CGColor); 
     red = components[0]; 
     green = components[1]; 
     blue = components[2]; 
     alpha = components[3]; 
    } 
}