Я знаю только один правильный способ сделать это - это позвонить CGGetColorComponents()
.Я попытался использовать UIColor
-getRed:green:blue:alpha
, но он не работает правильно на оттенках серого.Вот что я делаю:
Во-первых, у меня есть простой struct
, который позволяет мне легко манипулировать цветами RGBA.Эта структура полезна в других местах для выполнения всех видов манипуляций с цветом, таких как гамма-коррекция и усреднение цвета.
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;
Затем у меня есть функция, которая возвращает структуру RGBA
, заданную UIColor
.
RGBA RGBAFromUIColor(UIColor *color)
{
return RGBAFromCGColor(color.CGColor);
}
Он передает UIColor
CGColor
в функцию более низкого уровня для выполнения тяжелой работы.
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;
}
Таким образом, это прекрасно работает для оттенков серого (например, UIColor.whiteColor
, UIColor.blackColor
, UIColor.grayColor
и т. Д.), А также любой красный / зеленый / синий / альфа-цвет.Однако он не будет работать с цветами HSB.