Holen Sie RGB-Wert von UIColor Presets
-
11-10-2019 - |
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!
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 :-)