Как получить значения RGB из UIColor?

Я создаю объект цвета, используя следующий код.

curView.backgroundColor = [[UIColor alloc] initWithHue:229 saturation:40 brightness:75 alpha:1];

Как получить RGB-значения из созданного объекта цвета?

87
задан 13 янв. '09 в 0:39
источник поделиться
14 ответов
const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );

Эти ссылки содержат дополнительную информацию:

82
ответ дан 13 янв. '09 в 1:08
источник

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

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];
115
ответ дан 21 окт. '11 в 19:15
источник

SWIFT 3 и 4

Я обнаружил, что cgColor.components не всегда будут возвращать 4 цветовых значения, поэтому я изменил это так, чтобы получить их из обертки CIColor

extension UIColor {
    var redValue: CGFloat{ return CIColor(color: self).red }
    var greenValue: CGFloat{ return CIColor(color: self).green }
    var blueValue: CGFloat{ return CIColor(color: self).blue }
    var alphaValue: CGFloat{ return CIColor(color: self).alpha }
}

SWIFT 2

extension UIColor {
    var red: CGFloat{ return CGColorGetComponents(self.CGColor)[0] }
    var green: CGFloat{ return CGColorGetComponents(self.CGColor)[1] }
    var blue: CGFloat{ return CGColorGetComponents(self.CGColor)[2] }
    var alpha: CGFloat{ return CGColorGetComponents(self.CGColor)[3] }
}

Это не самый эффективный способ, поэтому я не стал бы использовать это, когда представление будет постоянно перерисовываться.

27
ответ дан 20 янв. '16 в 4:45
источник

Надеюсь, это будет полезно

CGFloat red, green, blue, alpha;

//Create a sample color

UIColor *redColor = [UIColor redColor];

//Call 

[redColor getRed: &red 
  green: &green
  blue: &blue 
  alpha: &alpha];
NSLog(@"red = %f. Green = %f. Blue = %f. Alpha = %f",
  red,
  green,
  blue,
  alpha);
10
ответ дан 11 июля '14 в 14:02
источник

Просто сделал для этого категорию.

NSLog(@"%f", [UIColor blueColor].blue); // 1.000000

Идет что-то вроде:

typedef enum { R, G, B, A } UIColorComponentIndices;

@implementation UIColor (EPPZKit)

-(CGFloat)red
{ return CGColorGetComponents(self.CGColor)[R]; }

-(CGFloat)green
{ return CGColorGetComponents(self.CGColor)[G]; }

-(CGFloat)blue
{ return CGColorGetComponents(self.CGColor)[B]; }

-(CGFloat)alpha
{ return CGColorGetComponents(self.CGColor)[A]; }

@end

Часть eppz!kit с более UIColor goodies.

7
ответ дан 23 янв. '14 в 3:12
источник
const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );

Спасибо. Я должен был добавить const в начале строки, поскольку он генерировал предупреждение.

5
ответ дан 13 янв. '09 в 1:35
источник
 UIColor *color = [[UIColor greenColor] retain]; //line 1

//OR(You will have color variable either like line 1 or line 2)

color = curView.backgroundColor;//line 2
CGColorRef colorRef = [color CGColor];

int _countComponents = CGColorGetNumberOfComponents(colorRef);

if (_countComponents == 4) {
    const CGFloat *_components = CGColorGetComponents(colorRef);
    CGFloat red     = _components[0];
    CGFloat green = _components[1];
    CGFloat blue   = _components[2];
    CGFloat alpha = _components[3];

    NSLog(@"%f,%f,%f,%f",red,green,blue,alpha);
}

[color release];
5
ответ дан 15 июня '13 в 5:40
источник

Свифт 3 версии Дэвида Риса отвечает:

extension UIColor {

    var redValue: CGFloat{
        return cgColor.components! [0]
    }

    var greenValue: CGFloat{
        return cgColor.components! [1]
    }

    var blueValue: CGFloat{
        return cgColor.components! [2]
    }

    var alphaValue: CGFloat{
        return cgColor.components! [3]
    }
}
2
ответ дан 08 нояб. '16 в 17:32
источник

Так как iOS 2.0 есть частный метод экземпляра на UIColor, называемый styleString, который возвращает строковое представление RGB или RGBA для цвета, даже для таких цветов, как whiteColor вне пространства RGB.

Objective-C:

@interface UIColor (Private)

- (NSString *)styleString;

@end

// ...

[[UIColor whiteColor] styleString]; // rgb(255,255,255)
[[UIColor redColor] styleString]; // rgb(255,0,0)
[[UIColor lightTextColor] styleString]; // rgba(255,255,255,0.600000)

В Swift вы можете использовать заголовок моста, чтобы открыть интерфейс. С чистым Swift вам нужно будет создать протокол @objc с приватным методом и unsafeBitCast UIColor с протоколом:

@objc protocol  UIColorPrivate {
    func styleString() -> String
}

let white = UIColor.whiteColor()
let red = UIColor.redColor()
let lightTextColor = UIColor.lightTextColor()

let whitePrivate = unsafeBitCast(white, UIColorPrivate.self)
let redPrivate = unsafeBitCast(red, UIColorPrivate.self)
let lightTextColorPrivate = unsafeBitCast(lightTextColor, UIColorPrivate.self)

whitePrivate.styleString() // rgb(255,255,255)
redPrivate.styleString() // rgb(255,0,0)
lightTextColorPrivate.styleString() // rgba(255,255,255,0.600000)
1
ответ дан 02 мая '16 в 16:26
источник

Верхний проголосовавший ответ устарел:

error:: 3: 1: ошибка: 'CGColorGetComponents' был заменен свойством 'CGColor.components'

Вместо этого используйте

myUIColor.cgColor.components

0
ответ дан 07 дек. '18 в 4:45
источник

Некоторые полезные макросы, которые я сделал для этого и других элементов управления цветом:

В вашем случае вы просто используете

getRGBA(myColor, red, green, blue, alpha);

NSLog(@"Red Value: %f", red);
NSLog(@"Blue Value: %f", green);
NSLog(@"Green Value: %f", blue);

Макросы:

#define rgba(r,g,b,a) [UIColor colorWithRed:((float)(r))/255.0f green:((float)(g))/255.0f blue:((float)(b))/255.0f alpha:a]
#define rgb(r,g,b) rgba(r, g, b, 1.0f)

#define rgbaf(r,g,b,a) [UIColor colorWithRed:(r) green:(g) blue:(b) alpha:a]
#define rgbf(r,g,b) rgbaf(r, g, b, 1.0f)

#define rgba_fromColor(__color, __r, __g, __b, __a) \
CGFloat __r, __g, __b, __a;\
UIColor *__unpackedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:__color]];/*Bring system colors into compatible color-space (e.g. DarkGrayColor)*/\
[__unpackedColor getRed:&__r green:&__g blue:&__b alpha:&__a];
#define getRGBA(__color, __r, __g, __b, __a) hsba_fromColor(__color, __r, __g, __b, __a)

#define getRed(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return r;\
})()\
)

#define getGreen(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return g;\
})()\
)

#define getBlue(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return b;\
})()\
)

#define getAlpha(__color)  (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return a;\
})()\
)










#define hsba(h,s,b,a) [UIColor colorWithHue:((float)(h))/360.0f saturation:((float)(s))/100.0f brightness:((float)(b))/100.0f alpha:a]
#define hsb(h,s,b) hsba(h, s, b, 1.0f)

#define hsbaf(h,s,b,a) [UIColor colorWithHue:(h) saturation:(s) brightness:(b) alpha:a]
#define hsbf(h,s,b) rgbaf(h, s, b, 1.0f)

#define hsba_fromColor(__color, __h, __s, __b, __a) \
CGFloat __h, __s, __b, __a;\
UIColor *__unpackedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:__color]];/*Bring system colors into compatible color-space (e.g. DarkGrayColor)*/\
[__unpackedColor getHue:&__h saturation:&__s brightness:&__b alpha:&__a];
#define getHSBA(__color, __h, __s, __b, __a) rgba_fromColor(__color, __h, __s, __b, __a)

#define getHue(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return h;\
})()\
)

#define getSaturation(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return s;\
})()\
)

#define getBrightness(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return b;\
})()\
)

/*
///already defined in RGBA macros
#define getAlpha(__color)  (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return a;\
})()\
)
*/
0
ответ дан 27 июля '18 в 9:44
источник

Использование HandyUIKit делает этот очень простой:

import HandyUIKit    

let color = UIColor(red: 0.1, green: 0.2, blue: 0.3, alpha: 0.4)

// get any of the rgba values
color.rgba.red    // => 0.1
color.rgba.green  // => 0.2
color.rgba.blue   // => 0.3
color.rgba.alpha  // => 0.4

Существует также аналогичная опция получить hsba значения:

let color = UIColor(hue: 0.1, saturation: 0.2, brightness: 0.3, alpha: 0.4)

// you can get any of the hsba values, too
color.hsba.hue         // => 0.1
color.hsba.saturation  // => 0.2
color.hsba.brightness  // => 0.3
color.hsba.alpha       // => 0.4

Просто установите его с помощью Carthage, и вам будет хорошо.

Надеюсь, это поможет!

0
ответ дан 30 июня '16 в 21:50
источник

Я хотел получить цвет фона UITableViewStyle "UITableViewStyleGrouped", поэтому в методе viewDidAppear: я добавил код:

NSLog(@"%@", self.tableView.backgroundView.backgroundColor);

Он сделал то, что я ожидал, и вернул журнал:

UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1

Итак, просто введите NSLog(@"%@", [UIColor whateverColor]);

0
ответ дан 05 авг. '15 в 5:24
источник

установите свой UIColor следующим образом

UIColor.FromRGB(128, 179, 255)

это для Xamarin ios... но, наверняка, есть быстрый способ, подобный этому.

-3
ответ дан 03 авг. '17 в 14:52
источник

Другие вопросы по меткам или Задайте вопрос