Làm thế nào để nhận giá trị RGB từ UIColor?


99

Tôi đang tạo một đối tượng màu bằng đoạn mã sau.

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

Làm cách nào để lấy các giá trị RGB từ đối tượng màu đã tạo?


có thể trùng lặp của Extracting rgb từ UIColor
Roddy

5
Chỉ cần lưu ý, các tham số được truyền vào phương thức -initWithHue: saturation: morning: alpha: đều phải nằm trong khoảng từ 0,0 đến 1,0.
geekinit

Câu trả lời:


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

Các liên kết này cung cấp thêm chi tiết:


Câu trả lời dưới đây đáng lẽ phải là một bình luận. Giáo sư.
defmech

17
Lưu ý: điều này chỉ hoạt động đối với các màu trong không gian RGB. Ví dụ: điều này sẽ không hoạt động trên [UIColor whiteColor] vì nó không có trong RGB.
Jason

2
Tôi gửi một số mẫu mã trong câu hỏi này để làm việc này trong phi RGB bối cảnh: stackoverflow.com/questions/4700168/...
Jesse Rusak

4
Nếu ai đó gặp vấn đề về cách lấy các giá trị từ đó colors, bạn có thể viết một cái gì đó như thế này,CGFloat red = colors[0];
Hemang

error: <EXPR>:3:1: error: 'CGColorGetComponents' has been replaced by property 'CGColor.components'
pkamb

119

Trong iOS 5, bạn có thể sử dụng:

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

Điều này chỉ được hỗ trợ trong iOS 5.0 hoặc mới hơn.
Jon Trauntvein

3
Lưu ý rằng phương pháp này sẽ chỉ thành công nếu màu bắt đầu nằm trong "không gian màu tương thích", có thể thay đổi tùy theo thiết bị / hệ điều hành. Ví dụ tôi chỉ phát hiện ra rằng gọi này trên [UIColor darkGrayColor] sẽ thất bại trên iPad 2 chạy iOS 7. Tuy nhiên cùng một màu sắc hoạt động tốt trên iPad Air chạy iOS 8.
devios1

@ devios1 này có khả năng có thể giải quyết bằng cách đầu tiên serializing màu sau đó deserializing nó sử dụng NSKeyedArchiver, như vậy:multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]];
Albert Renshaw

40

SWIFT 3 & 4

Tôi nhận thấy rằng cgColor.components không phải lúc nào cũng trả về 4 giá trị màu, vì vậy tôi đã thay đổi điều này để nó lấy chúng từ trình bao bọc 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] }
}

Đó không phải là cách hiệu quả nhất vì vậy tôi sẽ không sử dụng cách này khi một chế độ xem sẽ liên tục được vẽ lại.


11

Hy vọng rằng điều này sẽ hữu ích

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

7

Chỉ cần tạo một danh mục cho điều này.

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

Đi đến một cái gì đó như:

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

Một phần eppz!kitvới nhiều tính năng bổ sung của UIColor .


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

Cảm ơn. Tôi phải thêm constvào đầu dòng vì nó đang tạo ra một cảnh báo.


nó đã không tạo ra một cảnh báo cho việc cố gắng ép buộc ngầm CGFloat để nổi không? :)
braden

5
 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];

2

Câu trả lời của David Rees phiên bản 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]
    }
}

2

Bạn có thể sử dụng các thành phần CIColor (swift 5)

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

điều này cũng hoạt động cho không gian màu không phải RGB


1

Kể từ iOS 2.0, có một phương thức phiên bản riêng UIColorđược gọi styleStringđể trả về biểu diễn chuỗi RGB hoặc RGBA của màu, ngay cả đối với các màu như whiteColor bên ngoài không gian RGB.

Mục tiêu-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)

Trong Swift, bạn có thể sử dụng một tiêu đề bắc cầu để hiển thị giao diện. Với Swift thuần túy, bạn sẽ cần tạo một @objcgiao thức với phương thức riêng tư và unsafeBitCast UIColorvới giao thức:

@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

Câu trả lời được bình chọn nhiều nhất đã lỗi thời:

error:: 3: 1: error: 'CGColorGetComponents' đã được thay thế bằng thuộc tính 'CGColor.components'

Thay vào đó, hãy sử dụng

myUIColor.cgColor.components


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

0

Tôi muốn lấy màu nền của UITableViewStyle"UITableViewStyleGrouped" vì vậy trong viewDidAppear:phương pháp này, tôi đã thêm mã:

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

Nó đã làm những gì tôi dự đoán và trả lại nhật ký:

UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1

Vì vậy, trong ngắn hạn, chỉ cần nhập NSLog(@"%@", [UIColor whateverColor]);


0

Sử dụng HandyUIKit làm cho việc này thực sự dễ dàng :

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

Cũng có một tùy chọn tương tự để nhận hsbacác giá trị :

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

Chỉ cần cài đặt nó bằng Carthage và bạn đã sẵn sàng.

Tôi hy vọng nó sẽ giúp!


0

Một số macro hữu ích mà tôi đã thực hiện cho điều này và các điều khiển màu khác:

Trong trường hợp của bạn, bạn chỉ cần sử dụng

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

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

Macro:

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

-5

đặt UIColor của bạn như thế này

UIColor.FromRGB(128, 179, 255)

cái này dành cho Xamarin ios ... nhưng chắc chắn rằng có một phương pháp như thế này nhanh chóng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.