2009-05-03 5 views
79

Видел это раньше, но мой пример, похоже, не работает.Извлечение rgb из UIColor

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

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

ответ

108

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

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

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]; 
+0

ОК попробует это в одно мгновение, спасибо – 2009-05-03 12:47:15

+0

Почему «сохранить» здесь необходимо? Кроме того, я могу получить только 2 (не 4) компонента. – Susanna

+5

FYI, Susanna, оттенки серого отображаются как только 2 компонента. – davidcann

1

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

CGFloat red = [myColor red]; 
7

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

CGColorRef tmpColor = [[currentColorView backgroundColor] CGColor]; 
CGFloat newComponents[4] = {}; 
memcpy(newComponents, CGColorGetComponents(tmpColor), sizeof(newComponents)); 
// now newComponents is filled with tmpColor rgba data 
+0

Будет ли тест, если это будет простейшим решением и не так сложно понять – htafoya

+0

Я использовал его в своем приложении ios, и он работает. Не вижу никакой причины использовать этот подход – Realexer

38

В прошивке 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]; 
} 
+1

В MonoTouch (Xamarin): 'color.GetRGBA (из красного, зеленого, синего, альфа);' –

14

Вот все круглое решение, которое также принимает с учетом цветов, отличных от 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]; 

} 
5

Спасибо, что указал на это направление. Для любого, кто использует цвет в оттенках серого (созданный с помощью 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]; 
    } 
}