Извлечение RGB из UIColor

Видел это раньше, но мой пример, похоже, не работает.

const CGFloat *toCol = CGColorGetComponents([[UIColor greenColor] CGColor]);

Массив пуст, если посмотреть на него с помощью GDB. Какие-нибудь намеки?


person Community    schedule 03.05.2009    source источник


Ответы (6)


Предоставленный вами образец кода должен работать.

Попробуй это:

UIColor uicolor = [[UIColor greenColor] retain];
CGColorRef color = [uicolor CGColor];

int numComponents = CGColorGetNumberOfComponents(color);

if (numComponents == 4)
{
  const CGFloat *components = CGColorGetComponents(color);
  CGFloat red = components[0];
  CGFloat green = components[1];
  CGFloat blue = components[2];
  CGFloat alpha = components[3];
}

[uicolor release];
person Pablo Santa Cruz    schedule 03.05.2009
comment
ОК, сейчас попробую, спасибо - person ; 03.05.2009
comment
Зачем здесь нужен удерживать? Кроме того, я могу получить только 2 (а не 4) компонента. - person Susanna; 28.05.2010
comment
К вашему сведению, Сюзанна, оттенки серого отображаются только как 2 компонента. - person davidcann; 18.08.2010
comment
Я опубликовал решение, которое также работает с цветами, отличными от RGB / оттенками серого. - person Willster; 22.07.2012

В iOS 5 вы могли использовать:

UIColor *color = [UIColor orangeColor];
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0;

if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
    [color getRed:&red green:&green blue:&blue alpha:&alpha];
} else {
    const CGFloat *components = CGColorGetComponents(color.CGColor);
    red = components[0];
    green = components[1];
    blue = components[2];
    alpha = components[3];
}
person Teetotum    schedule 21.10.2011
comment
В MonoTouch (Xamarin): color.GetRGBA(out red, out green, out blue, out alpha); - person Jacob Foshee; 23.08.2013

Вот универсальное решение, которое также учитывает цвета, отличные от RGB, например. [UIColor blackColor]

UIColor *color = [UIColor blackColor];
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0;
// iOS 5
if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
     [color getRed:&red green:&green blue:&blue alpha:&alpha];
} else {
     // < iOS 5
     const CGFloat *components = CGColorGetComponents(color.CGColor);
     red = components[0];
     green = components[1];
     blue = components[2];
     alpha = components[3];
}

// This is a non-RGB color
if(CGColorGetNumberOfComponents(color.CGColor) == 2) {
    CGFloat hue;
    CGFloat saturation;
    CGFloat brightness;
    [color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];

}
person Willster    schedule 22.07.2012

Просто используйте memcpy:

CGColorRef tmpColor = [[currentColorView backgroundColor] CGColor];
CGFloat newComponents[4] = {};
memcpy(newComponents, CGColorGetComponents(tmpColor), sizeof(newComponents));
// now newComponents is filled with tmpColor rgba data
person Realexer    schedule 07.08.2011
comment
Проверим, если все в порядке, это самое простое решение и не такое сложное для понимания - person htafoya; 05.04.2013
comment
Я использовал его в своем приложении для iOS, и он работает. Не вижу причин не использовать этот подход - person Realexer; 18.04.2013

Спасибо за направление, Виллстер. Для всех, кто использует оттенки серого (созданный с помощью colorWithWhite:alpha:), приведенный ниже пример кода позволит вам определить значение белого (метод HSV не работает с цветами, созданными таким образом).

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0, white = 0.0;

// This is a non-RGB color
if(CGColorGetNumberOfComponents(self.color.CGColor) == 2) {
    [self.color getWhite:&white alpha:&alpha];
}
else {
    // iOS 5
    if ([self.color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
        [self.color getRed:&red green:&green blue:&blue alpha:&alpha];
    } else {
        // < iOS 5
        const CGFloat *components = CGColorGetComponents(self.color.CGColor);
        red = components[0];
        green = components[1];
        blue = components[2];
        alpha = components[3];
    }
}
person ianthetechie    schedule 21.01.2013

Ознакомьтесь с uicolor-utilities. Похоже, очень хорошая библиотека для этого и многих других полезных вещей с UIColor. Например, с помощью этой библиотеки вы можете написать:

CGFloat red = [myColor red];
person benvolioT    schedule 03.07.2011