iphone - hexadecimal - uicolor ios
Obtener valor RGB de los ajustes preestablecidos de UIColor (5)
Agregando a la respuesta de Jesse, aquí está cómo preservar el alfa:
- (void)getRGBAComponents:(CGFloat [4])components forColor:(UIColor *)color {
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char resultingPixel[4] = {0};
CGContextRef context = CGBitmapContextCreate(&resultingPixel,
1,
1,
8,
4,
rgbColorSpace,
kCGImageAlphaPremultipliedLast);
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
CGContextRelease(context);
CGColorSpaceRelease(rgbColorSpace);
CGFloat a = resultingPixel[3] / 255.0;
CGFloat unpremultiply = (a != 0.0) ? 1.0 / a / 255.0 : 0.0;
for (int component = 0; component < 3; component++) {
components[component] = resultingPixel[component] * unpremultiply;
}
components[3] = a;
}
Yo mi aplicación paso el valor de color RGB al servidor. Mi aplicación usa valores predefinidos de UIColor, como [UIColor grayColor], [UIColor redColor]. Sé que puedo usar el siguiente código:
const CGFloat *c = CGColorGetComponents(color.CGColor)
pero solo para los colores que están en el espacio de color RBG, sin embargo, [UIColor grayColor] no lo es.
¿Hay alguna forma de obtener valores RGB para colores que no sean RBG?
¡Gracias!
Nota cruzada desde mi respuesta a "¿Cómo convertir colores de un espacio de color a otro?" .
Para identificar diferentes espacios de color, puede obtener el CGColorSpaceModel
desde el color CGColorSpaceRef
:
UIColor* color = some color;
CGColorSpaceRef colorSpace = CGColorGetColorSpace([color CGColor]);
CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace);
Luego puede comparar colorSpaceModel
con las constantes definidas en CoreGraphics/CGColorSpace.h
. GetRed getRed:green:blue:alpha
de kCGColorSpaceModelRGB
funciona para kCGColorSpaceModelRGB
, mientras que getWhite:alpha
funciona para kCGColorSpaceModelMonochrome
.
Solo conozco una forma correcta de hacer esto, y es llamar a CGGetColorComponents()
. He intentado usar UIColor
'' -getRed:green:blue:alpha
, pero no funciona correctamente en los colores de escala de grises. Así que aquí está lo que hago:
Primero, tengo una struct
simple que me permite manipular los colores RGBA fácilmente. Esta estructura es útil en otros lugares para hacer todo tipo de cosas de manipulación de color como la corrección de gamma y el promedio de color.
typedef struct
{
CGFloat r; // Red component (0 <= r <= 1)
CGFloat g; // Green component (0 <= g <= 1)
CGFloat b; // Blue component (0 <= b <= 1)
CGFloat a; // Alpha/opacity component (0 <= a <= 1)
}
RGBA;
Entonces, tengo una función que devuelve una estructura RGBA
dado un UIColor
.
RGBA RGBAFromUIColor(UIColor *color)
{
return RGBAFromCGColor(color.CGColor);
}
Pasa el UIColor
del CGColor
a una función de nivel inferior para hacer el trabajo pesado.
RGBA RGBAFromCGColor(CGColorRef color)
{
RGBA rgba;
CGColorSpaceRef color_space = CGColorGetColorSpace(color);
CGColorSpaceModel color_space_model = CGColorSpaceGetModel(color_space);
const CGFloat *color_components = CGColorGetComponents(color);
int color_component_count = CGColorGetNumberOfComponents(color);
switch (color_space_model)
{
case kCGColorSpaceModelMonochrome:
{
assert(color_component_count == 2);
rgba = (RGBA)
{
.r = color_components[0],
.g = color_components[0],
.b = color_components[0],
.a = color_components[1]
};
break;
}
case kCGColorSpaceModelRGB:
{
assert(color_component_count == 4);
rgba = (RGBA)
{
.r = color_components[0],
.g = color_components[1],
.b = color_components[2],
.a = color_components[3]
};
break;
}
default:
{
NSLog(@"Unsupported color space model %i", color_space_model);
rgba = (RGBA) { 0, 0, 0, 0 };
break;
}
}
return rgba;
}
Por lo tanto, esto funciona muy bien para los colores en escala de grises (como UIColor.whiteColor
, UIColor.blackColor
, UIColor.grayColor
, etc.), así como cualquier color rojo / verde / azul / alfa. Sin embargo, no funcionará con los colores HSB.
UIColor tiene un método que le proporciona los componentes RGB ( -getRed:green:blue:alpha:
que funciona muy bien en iOS 7 o superior. En iOS 6 y versiones anteriores, este método fallará y devolverá NO
si el color no está en un espacio de color RGB (como [UIColor grayColor]
).
Para iOS 6 y versiones anteriores, la única forma que conozco para hacer esto que funciona en todos los espacios de color es crear un contexto de mapa de bits de Core Graphics en un espacio de color RGB y dibujarlo con su color. Luego puede leer los valores RGB del mapa de bits resultante. Tenga en cuenta que esto no funcionará para ciertos colores, como los colores de patrón (por ejemplo, [UIColor groupTableViewBackgroundColor]), que no tienen valores RGB razonables.
- (void)getRGBComponents:(CGFloat [3])components forColor:(UIColor *)color {
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char resultingPixel[4];
CGContextRef context = CGBitmapContextCreate(&resultingPixel,
1,
1,
8,
4,
rgbColorSpace,
kCGImageAlphaNoneSkipLast);
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
CGContextRelease(context);
CGColorSpaceRelease(rgbColorSpace);
for (int component = 0; component < 3; component++) {
components[component] = resultingPixel[component] / 255.0f;
}
}
Puedes usarlo así:
CGFloat components[3];
[self getRGBComponents:components forColor:[UIColor grayColor]];
NSLog(@"%f %f %f", components[0], components[1], components[2]);
puede obtener el valor RGB simplemente usando este
UIColor *chooseColor = view.backgroundColor;
CGFloat red,green,blue,alpha;
[chooseColor getRed:&red green:&green blue:&blue alpha:&alpha];
Gracias :-)