จะรับค่า RGB จาก UIColor ได้อย่างไร?


99

ฉันกำลังสร้างวัตถุสีโดยใช้รหัสต่อไปนี้

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

ฉันจะดึงค่า RGB จากวัตถุสีที่สร้างขึ้นได้อย่างไร


อาจซ้ำกันของการแยก rgb จาก UIColor
Roddy

5
โปรดทราบว่าพารามิเตอร์ที่ส่งผ่านไปยังเมธอด -initWithHue: ความอิ่มตัว: ความสว่าง: อัลฟา: ทั้งหมดควรอยู่ระหว่าง 0.0 ถึง 1.0
geekinit

คำตอบ:


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

ลิงค์เหล่านี้ให้รายละเอียดเพิ่มเติม:


คำตอบด้านล่างควรเป็นความคิดเห็น อ๊ะ.
defmech

18
หมายเหตุ: ใช้ได้เฉพาะกับสีในช่องว่าง RGB ตัวอย่างเช่นจะใช้ไม่ได้กับ [UIColor whiteColor] เนื่องจากไม่ได้อยู่ใน RGB
Jason

2
ฉันโพสต์โค้ดตัวอย่างในคำถามนี้เพื่อให้สิ่งนี้ทำงานในบริบทที่ไม่ใช่ RGB: stackoverflow.com/questions/4700168/…
Jesse Rusak

4
หากมีคนพบปัญหาในการรับค่าจากcolorsคุณสามารถเขียนข้อความเช่นCGFloat red = colors[0];
Hemang

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

119

ใน 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

3
ขอเตือนว่าวิธีนี้จะสำเร็จก็ต่อเมื่อสีเริ่มต้นอยู่ใน "พื้นที่สีที่เข้ากันได้" ซึ่งอาจแตกต่างกันไปขึ้นอยู่กับอุปกรณ์ / ระบบปฏิบัติการ ตัวอย่างเช่นฉันเพิ่งค้นพบว่าการเรียกสิ่งนี้บน [UIColor darkGrayColor] จะล้มเหลวบน iPad 2 ที่ใช้ iOS 7 อย่างไรก็ตามสีเดียวกันใช้งานได้ดีบน iPad Air ที่ใช้ iOS 8
devios1

@ devios1 สิ่งนี้สามารถแก้ไขได้โดยการทำให้สีเป็นอนุกรมก่อนจากนั้นจึงแยกสีออกโดยใช้NSKeyedArchiver:multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]];
Albert Renshaw

41

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

มันไม่ใช่วิธีที่มีประสิทธิภาพสูงสุดดังนั้นฉันจะไม่ใช้วิธีนี้ซึ่งจะมีการวาดมุมมองใหม่อยู่ตลอดเวลา


11

หวังว่านี่จะเป็นประโยชน์

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

เพิ่งสร้างหมวดหมู่สำหรับสิ่งนี้

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


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

ขอบคุณ. ฉันต้องเพิ่มconstที่จุดเริ่มต้นของบรรทัดเนื่องจากมันกำลังสร้างคำเตือน


มันไม่ได้สร้างคำเตือนสำหรับการพยายามร่าย CGFloat โดยปริยายหรือไม่? :)
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

คำตอบของ David Rees เวอร์ชัน 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

คุณสามารถใช้ส่วนประกอบ CIColor (รวดเร็ว 5)

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

สิ่งนี้ใช้ได้กับพื้นที่สีที่ไม่ใช่ RGB ด้วย


1

เนื่องจาก 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 คุณสามารถใช้ bridging header เพื่อแสดงอินเทอร์เฟซ ด้วย 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

คำตอบที่ได้รับการโหวตสูงสุดล้าสมัย:

ข้อผิดพลาด:: 3: 1: ข้อผิดพลาด: 'CGColorGetComponents' ถูกแทนที่ด้วยคุณสมบัติ 'CGColor.components'

ให้ใช้ไฟล์

myUIColor.cgColor.components


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

0

ฉันต้องการรับสีพื้นหลังของUITableViewStyle"UITableViewStyleGrouped" ดังนั้นในviewDidAppear:วิธีการที่ฉันเพิ่มรหัส:

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

มันทำตามที่ฉันคาดไว้และส่งคืนบันทึก:

UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1

สั้น ๆ ก็แค่พิมพ์ NSLog(@"%@", [UIColor whateverColor]);


0

การใช้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

มาโครที่มีประโยชน์บางอย่างที่ฉันสร้างขึ้นสำหรับสิ่งนี้และการควบคุมสีอื่น ๆ :

ในกรณีของคุณคุณจะใช้

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

-5

ตั้งค่า UIColor ของคุณเป็นแบบนี้

UIColor.FromRGB(128, 179, 255)

นี่คือ Xamarin ios ... แต่แน่นอนว่ามีวิธีการเช่นนี้อย่างรวดเร็ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.