Question

Je ma demande que je passe la valeur de couleur RVB au serveur. Mon application utilise des valeurs prédéfinies UIColor, comme [UIColor grayColor], [UIColor redColor]. Je sais que je peux utiliser le code suivant:

const CGFloat *c = CGColorGetComponents(color.CGColor)

mais seulement pour les couleurs qui sont dans l'espace couleur RBG, cependant, [UIColor grayColor] n'est pas.

Est-il possible d'obtenir des valeurs RVB pour les couleurs non-RBG?

Merci!

Était-ce utile?

La solution

UIColor a une méthode qui vous donne les composants RVB (-getRed:green:blue:alpha:) qui fonctionne très bien sur iOS 7 ou supérieur. Sur iOS 6 et versions antérieures, cette méthode échouera et NO de retour si la couleur n'est pas dans un espace de couleur RVB (comme il le fera pour [UIColor grayColor].)

Pour iOS 6 et plus tôt, la seule façon que je connaisse pour ce faire que les travaux dans tous les espaces de couleurs est de créer un contexte bitmap de base graphique dans un espace de couleur RVB et attirer dans avec votre couleur. Vous pouvez ensuite lire les valeurs RVB du bitmap résultant. Notez que cela ne fonctionnera pas pour certaines couleurs, comme les couleurs de motif (par exemple. [UIColor groupTableViewBackgroundColor]), qui n'ont des valeurs RVB raisonnables.

- (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;
    }
}

Vous pouvez l'utiliser quelque chose comme ceci:

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

Autres conseils

Je ne connais qu'une seule façon de le faire - et qui est à l'appel CGGetColorComponents(). Je l'ai essayé d'utiliser la UIColor de -getRed:green:blue:alpha, mais il ne fonctionne pas correctement sur les couleurs en niveaux de gris. Voici donc ce que je fais:

Tout d'abord, j'ai une struct de simple qui me permet de manipuler les couleurs RGBA facilement. Cette structure est d'ailleurs utile pour faire toutes sortes de choses de manipulation des couleurs comme la correction gamma et la moyenne des couleurs.

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;

Alors, j'ai une fonction qui renvoie une structure RGBA donné un UIColor.

RGBA RGBAFromUIColor(UIColor *color)
{
  return RGBAFromCGColor(color.CGColor);
}

Il passe à une fonction de niveau inférieur de UIColor du CGColor pour faire le levage lourd.

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;
}

Alors, cela fonctionne très bien pour les couleurs en niveaux de gris (comme UIColor.whiteColor, UIColor.blackColor, UIColor.grayColor, etc.), ainsi que tout rouge / vert / bleu / alpha couleur. Il ne fonctionnera pas avec les couleurs HSB, cependant.

Ajout à la réponse de Jesse, voici comment préserver alpha:

- (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;
}

ma réponse à «Comment convertir les couleurs d'un espace colorimétrique à un autre? .

Pour identifier les différents espaces de couleurs, vous pouvez obtenir le CGColorSpaceModel de la CGColorSpaceRef de la couleur:

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

Vous pouvez ensuite comparer colorSpaceModel avec les constantes définies dans CoreGraphics/CGColorSpace.h. Le getRed:green:blue:alpha de UIColor travaille pour kCGColorSpaceModelRGB, alors que les travaux de getWhite:alpha pour kCGColorSpaceModelMonochrome.

vous pouvez obtenir la valeur RVB simplement en utilisant cette

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

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

merci :-)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top