2015-02-21 14 views
41

में एक UIColor से आरजीबी संहिता (INT) प्राप्त करने के लिए मैं कैसे स्विफ्ट में एक UIColor के आरजीबी मूल्य प्राप्त करना चाहते हैं:स्विफ्ट

let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1) 
println("RGB Value is:"); 
println(swiftColor.getRGB()); <<<<<< How to do that ? 

जावा में मैं यह कर देंगी:

Color cnew = new Color(); 
int iColor = cnew.rgb(1, 165/255, 0); 
System.out.println(iColor); 

मुझे यह मूल्य कैसे प्राप्त करना चाहिए?

उत्तर

65

जावा getRGB() डिफ़ॉल्ट एसआरबीबी रंग अंतरिक्ष में रंग का प्रतिनिधित्व करने वाला एक पूर्णांक देता है (बिट्स 24-31 अल्फा हैं, 16-23 लाल हैं, 8-15 हरे हैं, 0-7 नीले हैं)।

UIColor ऐसी पद्धति नहीं है, लेकिन आप को परिभाषित कर सकते अपनी खुद की:

extension UIColor { 

    func rgb() -> Int? { 
     var fRed : CGFloat = 0 
     var fGreen : CGFloat = 0 
     var fBlue : CGFloat = 0 
     var fAlpha: CGFloat = 0 
     if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) { 
      let iRed = Int(fRed * 255.0) 
      let iGreen = Int(fGreen * 255.0) 
      let iBlue = Int(fBlue * 255.0) 
      let iAlpha = Int(fAlpha * 255.0) 

      // (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue). 
      let rgb = (iAlpha << 24) + (iRed << 16) + (iGreen << 8) + iBlue 
      return rgb 
     } else { 
      // Could not extract RGBA components: 
      return nil 
     } 
    } 
} 

उपयोग:

let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1) 
if let rgb = swiftColor.rgb() { 
    print(rgb) 
} else { 
    print("conversion failed") 
} 

ध्यान दें कि यह केवल तभी UIColor एक में परिभाषित किया गया है काम करेंगे "आरजीबी-संगत" रंगस्थान (जैसे आरजीबी, एचएसबी या ग्रेस्केल)। यह विफल हो सकता है यदि रंग CIColor या पैटर्न छवि से बनाया गया है, तो उस स्थिति में nil वापस आ गया है।

टिप्पणी: @ vonox7 के रूप में देखा, दिए गए मान 32-बिट प्लेटफॉर्म पर नकारात्मक हो सकता है (जो भी जावा getRGB() विधि के साथ मामला है)। यदि वह नहीं चाहता था, IntUInt या Int64 द्वारा प्रतिस्थापित करें।

+0

बहुत बहुत धन्यवाद। जो मैंने खोजा वह है। क्या आपके पास शायद वही पीछे है?(मैं तेजी से बहुत नया हूं) -> GetRed (iRGBValue: Int) -> Int? –

+1

@ user1344545: मुझे यकीन नहीं है कि मैं आपके प्रश्न को सही तरीके से समझता हूं। आप घटक को सामान्य शिफ्ट + मास्क ऑपरेशंस के साथ आरजीबी मान से निकाल सकते हैं, उदाहरण के लिए 'लाल = (आरजीबी >> 16) और 0xFF' दें। लेकिन यदि आप मूल्यों को अलग से चाहते हैं, तो उपरोक्त विधि में iRed, iGreen, iBlue, iAlpha की गणना करना आसान होगा और उन्हें एक ही संख्या में संयोजित नहीं करना आसान होगा। –

+0

आप सही समझ गए। लाल = (आरजीबी >> 16) और 0xFF है जो मैंने देखा था। आपको बहुत - बहुत धन्यवाद ! –

34

मार्टिन आर के जवाब से: विधि भी एक नामित टपल (एक स्विफ्ट 2 सुविधा) लौट सकता है:

extension UIColor { 

    func rgb() -> (red:Int, green:Int, blue:Int, alpha:Int)? { 
     var fRed : CGFloat = 0 
     var fGreen : CGFloat = 0 
     var fBlue : CGFloat = 0 
     var fAlpha: CGFloat = 0 
     if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) { 
      let iRed = Int(fRed * 255.0) 
      let iGreen = Int(fGreen * 255.0) 
      let iBlue = Int(fBlue * 255.0) 
      let iAlpha = Int(fAlpha * 255.0) 

      return (red:iRed, green:iGreen, blue:iBlue, alpha:iAlpha) 
     } else { 
      // Could not extract RGBA components: 
      return nil 
     } 
    } 
} 
+0

मुझे यह जवाब बेहतर लगता है। यह अधिक जानकारीपूर्ण और अधिक उपयोग करने योग्य है। :) धन्यवाद! –

+0

ऐसा लगता है कि अल्फा घटक को '255.0' तक गुणा नहीं किया जाना चाहिए और अंतिम ट्यूपल घटक प्रकार 'डबल' होना चाहिए। –

+0

आप 255 तक अल्फा को गुणा क्यों नहीं करेंगे? यदि आप 'Int' लौट रहे हैं, और आप 255 से गुणा नहीं करते हैं, तो आपको केवल 0 या 1 मिलेगा, जिनमें से दोनों व्यावहारिक रूप से अदृश्य हैं। – user1118321

18

स्विफ्ट 3.0 आईओएस 10

let colour = UIColor.red 
let rgbColour = colour.cgColor 
let rgbColours = rgbColour.components 
3

एक विस्तार आप उपयोग कर सकते हैं लिखा। मैं Int रों बजाय CGFloat रों के रूप में मान वापस जाने के लिए चुना क्योंकि CGFloat क्या UIColor की init विधि लेता

extension UIColor { 
    var colorComponents: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)? { 
     guard let components = self.cgColor.components else { return nil } 

     return (
      red: components[0], 
      green: components[1], 
      blue: components[2], 
      alpha: components[3] 
     ) 
    } 
} 

नोट है: स्विफ्ट 3.1/आईओएस 10 संगत, IOS 9 में UIColor.cgColor के रूप में काम न करें। घटकों उपलब्ध

+4

क्रैश होता है यदि रंग UIColor.white है जो मुझे लगता है कि UIColor UIColor (सफेद: CGFloat, अल्फा: CGFloat) के 2 पैरामीटर init का उपयोग करके बनाया गया है। 4 के बजाय दो पैरामीटर के रूप में दिखाता है और श्रेणी अपवाद से बाहर एक सूचकांक होता है – DatForis

0

स्विफ्ट 4. UIColor से हेक्स कोड (uint) हो रही है नहीं हो हो सकता है:

extension UIColor { 
    var coreImageColor: CIColor { 
     return CIColor(color: self) 
    } 
    var hex: UInt { 
     let red = UInt(coreImageColor.red * 255 + 0.5) 
     let green = UInt(coreImageColor.green * 255 + 0.5) 
     let blue = UInt(coreImageColor.blue * 255 + 0.5) 
     return (red << 16) | (green << 8) | blue 
    } 
} 
0

तेज आप रंग शाब्दिक उपयोग कर सकते हैं, आरजीबी रंग प्राप्त करने के लिए।

enter image description here

बस ऐसे ही

enter image description here

मुझे आशा है कि यह किसी के लिए उपयोगी हो सकता है की तरह