2012-04-09 9 views
12

puedo establecer UIColor con valores RGB:¿Hay alguna función para convertir UIColor en Brillo de saturación de tonos?

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

puedo establecer UIColor con los valores HSB:

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

También podría convertir de nuevo a RGB:

CGFloat* colors = CGColorGetComponents(Color1.CGColor); 

Pero, ¿cómo Puedo obtener HSB de uicolor?

+1

duplicado Posible de http://stackoverflow.com/questions/9142427/uicolor-conversion-from-rgb-to-hsv-set-brightness-to-uicolor http://stackoverflow.com/ preguntas/3017553/conversión-de-rgb-a-hsl-con-objetivo-c http: // stackoverflow.com/questions/1050874/how-do-i-convert-rgb-into-hsv-in-cocoa-touch –

Respuesta

40

Utilice el método UIColor: getHue:saturation:brightness:alpha:

De la documentación de Apple:
"devuelve los componentes que forman el color en el espacio de color HSB."

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

Ejemplo:

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 salida:

éxito: 1 matiz: 0,10, saturación: 0,79, brillo: 0,53, alfa: 1,00

Aquí es una versión corregida del método provisto por @WhiteTiger:

salida
// 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:

tonalidad: 0,10, saturación: 0,79, valor: 0,53

+2

pero esta característica solo se puede iniciar mediante 5.0 – WhiteTiger

+0

Más del 75% de los usuarios de iOS están en 5.0 ahora y un porcentaje más alto de usuarios que compran y/o actualizan aplicaciones Si <5.0 es un requisito, actualice su pregunta. – zaph

+0

ya sabes, pero hay casos, como los negocios en los que existe la obligación de seguir siendo compatibles con las versiones anteriores. – WhiteTiger

4

Tenga en cuenta que se trata de un proyecto, pero se puede tratar este código, si estás inferior a la versión 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

Comentarios: La línea 'r = r/255. g = g/255 .; b = b/255.; 'no es necesario si los valores ya son' CGFloat's. El 'calculado' final debe ser dividido por 360.0 para obtener un valor en el intervalo de 0.0 a 1.0. Los tipos 'double' podrían ser mejores como' CGFloat'. – zaph

+0

Corregí la rutina de conversión y la agregué a mi respuesta con un caso de prueba. – zaph

+0

Gracias por la corrección – WhiteTiger

17

Aquí es una buena manera de utilizar las funciones de Swift (extensiones, propiedades calculadas y las tuplas) para hacer lo mismo en tan sólo algunas líneas de código

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 actualización menor

Swift 3.2/4 aplica una nueva advertencia activa con el código anterior, ya que estaba modificando las hsba varias veces variables dentro de la misma llamada a getHue

Accesos simultáneos al parámetro 'hsba', pero la modificación requiere acceso exclusivo; Considere copiar a una variable local.

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

uso: self.inputUIImage .getColors ({(colores) en dejar hue = colors.primaryColor.hsba.h self.hueFilter .hue = tonalidad ?}) – ripegooseberry

+0

Gracias,? empaquetar este código como una extensión con retorno de tupla es bastante bueno y útil –

+0

¿Podría dar un ejemplo sobre cómo usar esto (Swift 3.1)? – Tom

Cuestiones relacionadas