Как правильно получить цветовые компоненты CGColor - PullRequest
6 голосов
/ 11 ноября 2010

У меня есть UILabel с черным цветом;

Я пишу следующий код для получения компонентов черного цвета.

UIColor *aColor = [aLabel.textColor retain];
const CGFloat* components = CGColorGetComponents(aColor.CGColor);
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();

, но всегда это дает компоненты зеленого цвета вместо черного цветакомпоненты;

Кто-нибудь имеет представление об этом?

Прохожу ли я другое цветовое пространство?

:-( Пожалуйста, помогите мне.

Ответы [ 5 ]

13 голосов
/ 11 ноября 2010

Скорее всего, неправильное цветовое пространство.Я полагаю, что альфа-компонент цветового пространства градаций серого получается там, где, как вы думаете, должен быть зеленый компонент.
Я использую эту функцию для создания строки из UIColor, я сталкиваюсь только с цветовыми пространствами RGB и Grayscale, поэтому я просто интерпретирую каждый цвет с меньшим, чем4 (R + G + B + A) компоненты в градациях серого.

if (CGColorGetNumberOfComponents(color.CGColor) < 4) {
    const CGFloat *components = CGColorGetComponents(color.CGColor);
    color = [UIColor colorWithRed:components[0] green:components[0] blue:components[0] alpha:components[1]];
}
if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) {
    NSLog(@"no rgb colorspace");
    // do seomthing
}
const CGFloat *components = CGColorGetComponents(color.CGColor);
NSString *colorAsString = [NSString stringWithFormat:@"%f,%f,%f,%f", components[0], components[1], components[2], components[3]];

Конечно, этот метод подходит не для всех случаев, вы должны принять его в соответствии с вашими требованиями.

6 голосов
/ 03 апреля 2011

Причина, по которой вы видите то, что выглядит как r=0, g=1, b=0, a=0, заключается в том, что вы неверно истолковываете значения в возвращаемом массиве как цветовые модели RGB. UIColor использует монохромное цветовое пространство для оттенков серого в данном случае черный .
То, что вы видите, представляет собой массив 2 компонентов из монохромной цветовой модели . Первый - уровень серого (0 для черного), а второй - alpha (1 для непрозрачного). Последние два значения, на которые вы смотрите, находятся в конце массива элементов 2 и в данном случае равны 0.

Вы заметите, если цвет черный, и вы попробуете CGColorGetNumberOfComponents(color.CGColor), он возвращает 2. И если вы попытаетесь CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)), он вернет 0, что соответствует kCGColorSpaceModelMonochrome (см. Перечисление CGColorSpaceModel в CGColorSpace.h)

см. CGColorSpace Reference

2 голосов
/ 28 ноября 2011

Я думаю, что это очень хороший способ получить представление rgb любого UIColor *, в котором уже есть удобный метод для сохранения его компонентов.

-(CGColorRef)CGColorRefFromUIColor:(UIColor*)newColor {
     CGFloat components[4] = {0.0,0.0,0.0,0.0};
     [newColor getRed:&components[0] green:&components[1] blue:&components[2]        alpha:&components[3]];
     CGColorRef newRGB = CGColorCreate(CGColorSpaceCreateDeviceRGB(), components);
     return newRGB;
}
1 голос
/ 15 января 2011

Один из способов получить RGB для них - нарисовать цвет в графическом контексте и прочитать его обратно. Смотрите мой ответ на этот вопрос, например, код:

Получить значение RGB из предустановок UIColor

0 голосов
/ 15 марта 2013

рабочий экзамен с UIColor: CALayer * btnLayer = [myLittleButton layer];

[layer setBackgroundColor:<#(CGColorRef)#>] становится: [btnLayer setBorderColor:[[UIColor grayColor] CGColor]];

просто убедитесь, что оригинальные цвета кнопок не покрывают слой

...