Pregunta

I mi solicitud me pasan valor de color RGB al servidor. Mi aplicación utiliza UIColor valores predefinidos, como [UIColor grayColor], [UIColor redcolor]. Sé que puedo usar siguiente código:

const CGFloat *c = CGColorGetComponents(color.CGColor)

pero sólo para los colores que se encuentran en el espacio de color RBG, sin embargo, [UIColor grayColor] no lo es.

¿Hay alguna manera de obtener los valores RGB para los colores no RBG?

Gracias!

¿Fue útil?

Solución

UIColor tiene un método que le da las 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 NO vuelta si el color no se encuentra en un espacio de color RGB (como lo hará para [UIColor grayColor].)

Para iOS 6 y versiones anteriores, la única forma que conozco para hacer esto que las obras en todos los espacios de color es crear un contexto de mapa de bits núcleo de gráficos en un espacio de color RGB y dibujar en ella con su color. A continuación, puede leer los valores RGB del mapa de bits resultante. Tenga en cuenta que esto no va a funcionar para ciertos colores, como los colores del dibujo (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;
    }
}

Se puede utilizar algo como esto:

    CGFloat components[3];
    [self getRGBComponents:components forColor:[UIColor grayColor]];
    NSLog(@"%f %f %f", components[0], components[1], components[2]);

Otros consejos

Yo sólo sabe de una forma correcta de hacer esto - y que es CGGetColorComponents() llamada. He intentado usar UIColor de -getRed:green:blue:alpha, pero no funciona correctamente en colores en escala de grises. Así que aquí es lo que hago:

En primer lugar, tengo una struct sencilla que me permite manipular colores RGBA fácilmente. Esta estructura está en otra parte útil para hacer todo tipo de cosas manipulación del color como 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);
}

Se pasa 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 de escala de grises (como UIColor.whiteColor, UIColor.blackColor, UIColor.grayColor, etc.), así como cualquier rojo / verde / azul / alfa color. No funcionará con colores HSB, sin embargo.

Añadir a la respuesta de Jesse, aquí es cómo preservar la 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;
}

mi respuesta a 'Cómo convertir colores de un espacio de color a otro?' .

Para identificar los diferentes espacios de color se puede obtener el CGColorSpaceModel de CGColorSpaceRef de color:

UIColor* color = some color;
CGColorSpaceRef colorSpace = CGColorGetColorSpace([color CGColor]);
CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace);

A continuación, se puede comparar con colorSpaceModel las constantes definidas en CoreGraphics/CGColorSpace.h. getRed:green:blue:alpha de UIColor trabaja para kCGColorSpaceModelRGB, mientras que las obras getWhite:alpha para kCGColorSpaceModelMonochrome.

Puede Obtener valor RGB simplemente usando este

UIColor *chooseColor = view.backgroundColor;
CGFloat red,green,blue,alpha;

[chooseColor getRed:&red green:&green blue:&blue alpha:&alpha]; 

Gracias :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top