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

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

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

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

возможный дубликат Извлечение rgb из UIColor

Roddy 28.06.2011 13:19

Замечу, что параметры, передаваемые в метод -initWithHue: saturation: яркость: альфа:, должны находиться в диапазоне от 0,0 до 1,0.

geekinit 04.09.2011 08:58
stackoverflow.com/questions/4700168/…
Waseem Shah 13.06.2014 14:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
102
3
86 895
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

Ответ принят как подходящий
const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );

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

Ответ ниже должен был быть комментарием. Ой.

defmech 13.01.2009 01:36

Примечание: это работает только для цветов в пространстве RGB. Например, это не будет работать с [UIColor whiteColor], так как это не в RGB.

Jason 16.02.2010 01:06

Я разместил в этом вопросе образец кода, чтобы заставить его работать в контекстах, отличных от RGB: stackoverflow.com/questions/4700168/…

Jesse Rusak 15.01.2011 18:28

Если кто-то обнаружит проблему с получением значений из colors, вы можете написать что-то вроде CGFloat red = colors[0];

Hemang 02.07.2014 13:49
error: <EXPR>:3:1: error: 'CGColorGetComponents' has been replaced by property 'CGColor.components'
pkamb 07.12.2018 04:44
const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );

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

не генерировалось ли предупреждение о попытке неявно преобразовать CGFloat в float? :)

braden 18.02.2015 01:37

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

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];

Это поддерживается только в iOS 5.0 или новее.

Jon Trauntvein 12.12.2011 19:14

Имейте в виду, что этот метод будет успешным только в том случае, если начальный цвет находится в «совместимом цветовом пространстве», которое может варьироваться в зависимости от устройства / ОС. Например, я только что обнаружил, что вызов этого метода в [UIColor darkGrayColor] завершится ошибкой на iPad 2 под управлением iOS 7. Однако тот же цвет отлично работает на iPad Air под управлением iOS 8.

devios1 19.02.2015 01:38

@ devios1 Вероятно, это можно решить, сначала сериализуя цвет, а затем десериализуя его с помощью NSKeyedArchiver, например: multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]];

Albert Renshaw 27.07.2018 09:18
 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];

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

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 вкусности.

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

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);

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

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

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

UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1

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

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

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

Начиная с 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 с частным методом, а unsafeBitCastUIColor с протоколом:

@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)

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

Просто установить его с помощью Карфагена, и все готово.

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

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

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

UIColor.FromRGB(128, 179, 255)

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

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

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

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;\
})()\
)
*/

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

error: :3:1: error: 'CGColorGetComponents' has been replaced by property 'CGColor.components'

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

myUIColor.cgColor.components

let color = myUIColor.cgColor.components let r = color! [0] let g = color! [1] let b = color! [2]

Gurjinder Singh 15.05.2020 08:03

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

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

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

Другие вопросы по теме