Domanda

Ho la mia domanda mi passano valore di colore RGB al server. La mia app utilizza UIColor predefinito valori, come [UIColor grayColor], [UIColor redcolor]. So che posso usare seguente codice:

const CGFloat *c = CGColorGetComponents(color.CGColor)

, ma solo per i colori che sono nello spazio di colore RBG, tuttavia, [UIColor grayColor] non è.

C'è un modo per ottenere i valori RGB per i colori non-RBG?

Grazie!

È stato utile?

Soluzione

UIColor ha un metodo che vi dà i componenti RGB (-getRed:green:blue:alpha:), che funziona alla grande su iOS 7 o superiore. Su iOS 6 e versioni precedenti, questo metodo avrà esito negativo e NO di ritorno, se il colore non è in uno spazio colore RGB (come sarà per [UIColor grayColor].)

Per iOS 6 e versioni precedenti, l'unico modo che conosco per fare questo che le opere in tutti gli spazi colore è quello di creare un contesto bitmap core grafico in uno spazio colore RGB e disegnare in essa con il colore. È quindi possibile leggere i valori RGB dal bitmap risultante. Si noti che questo non funzionerà per alcuni colori, come i colori del modello (ad es. [UIColor groupTableViewBackgroundColor]), che non hanno valori RGB ragionevoli.

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

Si può usare qualcosa di simile a questo:

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

Altri suggerimenti

So solo di un modo corretto per fare questo - e che è alla chiamata CGGetColorComponents(). Ho provato con UIColor di -getRed:green:blue:alpha, ma non funziona correttamente sui colori in scala di grigi. Così qui è quello che faccio:

Per prima cosa, ho una semplice struct che mi permette di manipolare i colori RGBA facilmente. Questa struttura è altrove utile per fare ogni sorta di cose manipolazione colore come correzione della gamma e una media di colore.

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;

Poi, ho una funzione che restituisce una struttura RGBA dato un UIColor.

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

Si passa UIColor del CGColor ad una funzione di livello inferiore per fare il sollevamento di carichi pesanti.

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

Quindi, questo funziona alla grande per i colori in scala di grigi (come UIColor.whiteColor, UIColor.blackColor, UIColor.grayColor, ecc) così come qualsiasi rosso / verde / blu / alpha colore. Non funzionerà con i colori HSB, tuttavia.

L'aggiunta alla risposta di Jesse, qui è come preservare 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;
}

mia risposta a 'Come convertire i colori da uno spazio colore ad un altro?' .

Per identificare i diversi spazi colore è possibile ottenere il CGColorSpaceModel dal CGColorSpaceRef del colore:

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

Quindi è possibile confrontare colorSpaceModel con le costanti definite in CoreGraphics/CGColorSpace.h. getRed:green:blue:alpha di UIColor lavora per kCGColorSpaceModelRGB, mentre opere getWhite:alpha per kCGColorSpaceModelMonochrome.

È possibile ottenere valore RGB semplicemente utilizzando questo

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

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

grazie :-)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top