UIColor से RGB मान कैसे प्राप्त करें?


99

मैं निम्नलिखित कोड का उपयोग करके एक कलर ऑब्जेक्ट बना रहा हूं।

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

मैं बनाई गई रंग वस्तु से RGB मान कैसे प्राप्त कर सकता हूं?



5
बस एक ध्यान दें, मापदंडों को विधि -initWithHue: संतृप्ति: चमक: अल्फा: सभी में 0.0 और 1.0 के बीच होना चाहिए।
geekinit

जवाबों:


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

ये लिंक आगे का विवरण प्रदान करते हैं:


नीचे उत्तर एक टिप्पणी होना चाहिए था। उफ़।
बदनाम

17
नोट: यह केवल RGB स्पेस में रंगों के लिए काम करता है। उदाहरण के लिए, यह [UIColor whiteColor] पर काम नहीं करेगा क्योंकि यह RGB में नहीं है।
जेसन

2
मैंने गैर-RGB संदर्भों में इस काम को पाने के लिए इस प्रश्न में कुछ नमूना कोड पोस्ट किया: stackoverflow.com/questions/4700168/…
Jesse Rusak

4
यदि किसी को इस बात की समस्या है कि मूल्यों को कैसे प्राप्त किया जाए colors, तो आप कुछ लिख सकते हैं, जैसेCGFloat red = colors[0];
हेमांग जूल

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 या नए में समर्थित है।
जॉन ट्रैंटवेविन

3
चेतावनी दी है कि यह विधि केवल तभी सफल होगी जब शुरुआती रंग "एक संगत रंग स्थान" में हो, जो डिवाइस / ओएस के आधार पर भिन्न हो सकता है। उदाहरण के लिए, मैंने अभी पता लगाया है कि [UIColor darkGrayColor] पर यह कॉल करना iOS 2 पर चलने वाले iOS 8 पर विफल होगा। हालाँकि एक ही रंग iOS iOS पर चलने वाले एयर पर ठीक काम करता है।
devios1

@ devios1 यह संभवतया पहले रंग को क्रमबद्ध करने के द्वारा हल किया जा सकता है, फिर इसका उपयोग करके deserializing NSKeyedArchiver, जैसे:multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]];
अल्बर्ट रेनशॉ

40

स्विफ्ट 3 और 4

मैंने पाया कि cgColor.compords हमेशा 4 रंग मान नहीं लौटाएगा, इसलिए मैंने इसे बदल दिया ताकि यह उन्हें CIC के टॉपर से मिल जाए

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

स्विफ्ट 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लाइन के शुरू में जोड़ना पड़ा क्योंकि यह एक चेतावनी उत्पन्न कर रहा था।


क्या इसने सीजीफ्लोट को तैरने के लिए उकसाने की कोशिश के लिए चेतावनी उत्पन्न नहीं की? :)
ब्रैडेन

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

डेविड रीस के उत्तर का स्विफ्ट 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

यह गैर-आरजीबी रंग स्थान के लिए भी काम करता है


1

IOS 2.0 के बाद से एक निजी इंस्टेंस विधि है, UIColorजिसे styleStringआरजीबी या RGBA स्ट्रिंग प्रतिनिधित्व का रंग मिलता है, यहां तक ​​कि RGB स्थान के बाहर व्हाइट कलर जैसे रंग भी।

उद्देश्य सी:

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

स्विफ्ट में आप इंटरफ़ेस को उजागर करने के लिए एक ब्रिजिंग हेडर का उपयोग कर सकते हैं। शुद्ध स्विफ्ट के साथ, आपको @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: त्रुटि: 'CGColorGetCompords' को संपत्ति 'CGColor.compords' ने बदल दिया है

इसके बजाय, उपयोग करें

myUIColor.cgColor.components


1
लेट कलर = myUIColor.cgColor.compords let r = color! [0] Let g = color! [1] let b = color! [2]
गुरजिंदर सिंह

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 के लिए है ... लेकिन निश्चित रूप से स्विफ्ट में इस तरह की एक विधि है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.