2012-04-09 21 views
12

i kann UIColor mit RGB-Werte gesetzt:Gibt es eine Funktion zum Konvertieren von UIColor in Farbton-Sättigungshelligkeit?

[UIColor colorWithRed:0.53 green:0.37 blue:0.11 alpha:1.00]; 

i mit hsb Werte UIColor können:

[UIColor colorWithHue:0.10 saturation:0.16 brightness:0.13 alpha:1.00]; 

ich es könnte auch zu RGB konvertieren zurück:

CGFloat* colors = CGColorGetComponents(Color1.CGColor); 

Aber wie Ich kann HSB von uicolor bekommen?

+1

Mögliche Duplikat http://stackoverflow.com/questions/9142427/uicolor-conversion-from-rgb-to-hsv-set-brightness-to-uicolor http://stackoverflow.com/ Fragen/3017553/converting-from-rgb-zu-hsl-mit-objective-c http: // stackoverflow.com/questions/1050874/how-do-i-convert-rgb-in-hsv-in-cocoa-touch –

Antwort

40

Verwenden Sie die UIColor Methode: getHue:saturation:brightness:alpha:

aus der Apple-docs: "Gibt die Komponenten, die die Farbe im HSB-Farbraum bilden"

- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha 

Beispiel:

UIColor *testColor = [UIColor colorWithRed:0.53 green:0.37 blue:0.11 alpha:1.00]; 

CGFloat hue; 
CGFloat saturation; 
CGFloat brightness; 
CGFloat alpha; 
BOOL success = [testColor getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]; 
NSLog(@"success: %i hue: %0.2f, saturation: %0.2f, brightness: %0.2f, alpha: %0.2f", success, hue, saturation, brightness, alpha); 

NSLog output:

success: 1 hue: 0,10, Sättigung: 0,79, Helligkeit: 0,53, alpha: 1,00

Hier ist eine korrigierte Version der Methode von @WhiteTiger:

// Test values 
CGFloat red = 0.53; 
CGFloat green = 0.37; 
CGFloat blue = 0.11; 

CGFloat hue = 0; 
CGFloat saturation = 0; 
CGFloat brightness = 0; 

CGFloat minRGB = MIN(red, MIN(green,blue)); 
CGFloat maxRGB = MAX(red, MAX(green,blue)); 

if (minRGB==maxRGB) { 
    hue = 0; 
    saturation = 0; 
    brightness = minRGB; 
} else { 
    CGFloat d = (red==minRGB) ? green-blue : ((blue==minRGB) ? red-green : blue-red); 
    CGFloat h = (red==minRGB) ? 3 : ((blue==minRGB) ? 1 : 5); 
    hue = (h - d/(maxRGB - minRGB))/6.0; 
    saturation = (maxRGB - minRGB)/maxRGB; 
    brightness = maxRGB; 
} 
NSLog(@"hue: %0.2f, saturation: %0.2f, value: %0.2f", hue, saturation, brightness); 

NSLog Ausgabe:

Farbton: 0,10, Sättigung: 0.79, Wert: 0,53

+2

aber diese Funktion ist nur von 5.0 bootfähig – WhiteTiger

+0

Über 75% der iOS-Benutzer sind auf 5.0 jetzt und ein höherer Prozentsatz von Nutzer, die Apps kaufen und/oder aktualisieren. Wenn <5.0 erforderlich ist, aktualisieren Sie Ihre Frage. – zaph

+0

Sie wissen, aber es gibt Fälle, wie das Geschäft, in dem es eine Verpflichtung gibt, mit früheren Versionen kompatibel zu bleiben. – WhiteTiger

4

Beachten Sie, dass es sich um ein Entwurf ist, aber Sie können diesen Code versuchen, wenn Sie niedrige Version 5,0

... 
CGFloat computedH = 0; 
CGFloat computedS = 0; 
CGFloat computedV = 0; 

CGFloat minRGB = MIN(r, MIN(g,b)); 
CGFloat maxRGB = MAX(r, MAX(g,b)); 

if (minRGB==maxRGB) { 
    computedH = 0; 
    computedS = 0; 
    computedV = minRGB; 
} else { 
    double d = (r==minRGB) ? g-b : ((b==minRGB) ? r-g : b-r); 
    double h = (r==minRGB) ? 3 : ((b==minRGB) ? 1 : 5); 
    computedH = (60*(h - d/(maxRGB - minRGB)))/360.; 
    computedS = ((maxRGB - minRGB)/maxRGB); 
    computedV = maxRGB; 
} 
... 
+0

Kommentare: Die Zeile 'r = r/255 .; g = g/255 .; b = b/255.; 'ist nicht notwendig, wenn die Werte bereits' CGFloat's sind. Das endgültige 'computedV' muss durch 360.0 dividiert werden, um einen Wert im Intervall von 0.0 bis 1.0 zu erhalten. Die "doppelten" Typen könnten besser als "CGFloat" sein. – zaph

+0

Ich habe Ihre Konvertierungsroutine korrigiert und sie meiner Antwort mit einem Testfall hinzugefügt. – zaph

+0

Danke für die Korrektur – WhiteTiger

17

Hier ist eine schöne Art und Weise Swift-Funktionen (Erweiterungen, berechnet Eigenschaften und Tupeln) der Verwendung von in nur das gleiche zu tun, ein einige Zeilen Code.

extension UIColor { 
    var hsba: (h: CGFloat, s: CGFloat, b: CGFloat, a: CGFloat) { 
    var hsba: (h: CGFloat, s: CGFloat, b: CGFloat, a: CGFloat) = (0, 0, 0, 0) 
    self.getHue(&(hsba.h), saturation: &(hsba.s), brightness: &(hsba.b), alpha: &(hsba.a)) 
    return hsba 
    } 
} 

Swift 3.2/4 kleines Update

Swift 3.2/4 erzwungen eine neue Warnung mit dem vorherigen Code ausgelöst, weil Sie die hsba Variable mehrmals im gleichen Aufruf getHue

wurden modifiziert

Gleichzeitige Zugriffe auf Parameter 'hsba', aber Änderung erfordert exklusiven Zugriff; Überlegen Sie, ob Sie in eine lokale Variable kopieren möchten.

extension UIColor { 
    var hsba:(h: CGFloat, s: CGFloat,b: CGFloat,a: CGFloat) { 
     var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 
     self.getHue(&h, saturation: &s, brightness: &b, alpha: &a) 
     return (h: h, s: s, b: b, a: a) 
    } 
} 
+0

Nutzung: self.inputUIImage .getColors ({(Farben) in lassen Farbton = colors.primaryColor.hsba.h self.hueFilter .hue = Farbton ?}) – ripegooseberry

+0

Danke? diesen Code als Erweiterung mit Tuple-Return zu packen, ist ganz nett und nützlich –

+0

Könnten Sie ein Beispiel geben, wie man das benutzt (Swift 3.1)? – Tom