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

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

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

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


person defmech    schedule 12.01.2009    source источник
comment
возможный дубликат Извлечение rgb из UIColor   -  person Roddy    schedule 28.06.2011
comment
Замечу, что параметры, передаваемые в метод -initWithHue: saturation: яркость: альфа:, должны находиться в диапазоне от 0,0 до 1,0.   -  person geekinit    schedule 04.09.2011
comment
stackoverflow.com/questions/ 4700168 /   -  person Waseem Shah    schedule 13.06.2014


Ответы (15)


const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );

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

person codelogic    schedule 12.01.2009
comment
Ответ ниже должен был быть комментарием. Ой. - person defmech; 13.01.2009
comment
Примечание: это работает только для цветов в пространстве RGB. Например, это не будет работать с [UIColor whiteColor], поскольку это не в RGB. - person Jason; 16.02.2010
comment
Я разместил в этом вопросе пример кода, чтобы заставить его работать в контекстах, отличных от RGB: stackoverflow.com/questions/4700168/ - person Jesse Rusak; 15.01.2011
comment
Если кто-то обнаружит проблему с получением значений из colors, вы можете написать что-то вроде CGFloat red = colors[0]; - person Hemang; 02.07.2014

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

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];
person Teetotum    schedule 21.10.2011
comment
Это поддерживается только в iOS 5.0 или новее. - person Jon Trauntvein; 12.12.2011
comment
Имейте в виду, что этот метод будет успешным только в том случае, если начальный цвет находится в совместимом цветовом пространстве, которое может варьироваться в зависимости от устройства / ОС. Например, я только что обнаружил, что вызов этого метода в [UIColor darkGrayColor] завершится ошибкой на iPad 2 под управлением iOS 7. Однако тот же цвет отлично работает на iPad Air под управлением iOS 8. - person devios1; 19.02.2015
comment
@ devios1 Это, вероятно, можно решить, сначала сериализуя цвет, а затем десериализуя его с помощью NSKeyedArchiver, например: multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]]; - person Albert Renshaw; 27.07.2018

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] }
}

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

person David Rees    schedule 20.01.2016

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

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);
person Ashok Kumar    schedule 11.07.2014

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

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.

person Geri Borbás    schedule 23.01.2014

Вы можете использовать компоненты CIColor (swift 5)

let ciColor = CIColor(color: backgroundColor)
let alpha = ciColor.alpha
let red = ciColor.red
let blue = ciColor.blue
let green = ciColor.green

это работает и для цветового пространства без RGB

person Mari    schedule 18.11.2019

const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );

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

person defmech    schedule 12.01.2009
comment
не генерировалось ли предупреждение о попытке неявно преобразовать CGFloat в float? :) - person braden; 18.02.2015

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

Цель-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)
person JAL    schedule 02.05.2016

Swift 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]
    }
}
person danfordham    schedule 08.11.2016

Ответ, получивший наибольшее количество голосов, устарел:

ошибка:: 3: 1: ошибка: «CGColorGetComponents» заменено свойством «CGColor.components»

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

myUIColor.cgColor.components

person pkamb    schedule 07.12.2018
comment
let color = myUIColor.cgColor.components let r = color! [0] let g = color! [1] let b = color! [2] - person Gurjinder Singh; 15.05.2020

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

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

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

UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1

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

person Scott    schedule 05.08.2015

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

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

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;\
})()\
)
*/
person Albert Renshaw    schedule 27.07.2018

Свойство CGColor components - это то, что вам нужно.

Код ниже

UIColor.separator.cgColor.components

Печатает следующие

Optional([0.23529411764705882, 0.23529411764705882, 0.2627450980392157, 0.29])

Где первый элемент массива - значение красного цвета, второй - значение зеленого цвета, третье - значение синего цвета, а последнее - значение альфа. Довольно просто!

person shokuroff    schedule 15.07.2021

Использование 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, и все готово.

Я надеюсь, что это помогает!

person Jeehut    schedule 30.06.2016

установите свой UIColor вот так

UIColor.FromRGB(128, 179, 255)

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

person Daniel    schedule 03.08.2017