Frage

ich meine Anwendung übergeben ich RGB-Farbwert an den Server. Meine app verwendet UIColor Werte vorgegeben, wie [UIColor grayColor], [UIColor RedColor]. Ich weiß, dass ich folgenden Code verwenden:

const CGFloat *c = CGColorGetComponents(color.CGColor)

aber nur für Farben, die in RBG-Farbraum sind jedoch [UIColor grayColor] nicht.

Gibt es eine Möglichkeit der RGB-Werte für nicht-RBG Farben zu bekommen?

Danke!

War es hilfreich?

Lösung

hat UIColor eine Methode, die Ihnen die RGB-Komponenten (-getRed:green:blue:alpha:) gibt, die auf iOS 7 oder höher funktioniert gut. Auf iOS 6 und früheren Versionen wird diese Methode fehl und Rückkehr NO wenn die Farbe nicht in einem RGB-Farbraum ist (wie es wird für [UIColor grayColor].)

Für iOS 6 und früher der einzige Weg, ich weiß, dies zu tun, dass die Arbeiten in allen Farbräumen sind ein Core Graphics Bitmap Kontext in einem RGB-Farbraum zu schaffen und in denen sie mit Ihrer Farbe zeichnen. Anschließend können Sie die RGB-Werte aus der resultierenden Bitmap ausgelesen. Beachten Sie, dass dies nicht funktionieren wird für bestimmte Farben, wie Musterfarben (z. B. [UIColor groupTableViewBackgroundColor]), die nicht über angemessene RGB-Werte.

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

Sie können es verwenden, so etwas wie dieses:

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

Andere Tipps

Ich kenne nur einen richtigen Weg, dies zu tun - und das ist nach Aufruf CGGetColorComponents(). Ich habe versucht, UIColor die -getRed:green:blue:alpha verwenden, aber es funktioniert nicht richtig auf Graustufen Farben. Also hier ist, was ich tun:

Zuerst habe ich eine einfache struct, die mich leicht RGBA Farben manipulieren lässt. Diese Struktur ist nützlich, an anderer Stelle für alle Arten von Farbmanipulation Sachen wie Gammakorrektur und Farblungs tun.

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;

Dann habe ich eine Funktion, dass die Renditen eine RGBA Struktur eine UIColor gegeben.

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

Es geht die UIColor des CGColor auf eine niedrigere Ebene Funktion, das schwere Heben zu tun.

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

So funktioniert diese ideal für Graustufen- Farben (wie UIColor.whiteColor, UIColor.blackColor, UIColor.grayColor, etc.) sowie alle rot / grün / blau / Alpha-Farbe. Es wird nicht funktionieren mit HSB-Farben, aber.

Zusätzlich zu Jesse Antwort, hier ist, wie Alpha zu erhalten:

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

gecrosspostet von meine Antwort auf ‚Wie Farben von einem Farbraum in einen anderen zu konvertieren?‘ .

Um unterschiedliche Farbräume identifizieren können Sie die CGColorSpaceModel aus der CGColorSpaceRef der Farbe erhalten:

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

Dann können Sie colorSpaceModel mit den in CoreGraphics/CGColorSpace.h definierten Konstanten vergleichen. UIColor des getRed:green:blue:alpha arbeitet für kCGColorSpaceModelRGB, während getWhite:alpha Arbeiten für kCGColorSpaceModelMonochrome.

Sie können RGB-Wert Setzen Sie sich einfach mit Hilfe dieses

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

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

Danke :-)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top