Swift

2015-02-21 24 views
41

bir UIColor dan RGB kodu (INT) almak için nasıl Swift bir UIColor RGB Değerini almak istiyorum şu şekildedir:Swift

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

Ben yapardım:

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

Bu değeri nasıl alabilirim?

cevap

65

Java getRGB() (16-23 8-15 0-7 mavi, yeşil, kırmızı, alfa olan bit 24-31) varsayılan sRGB renk uzayında renk gösteren bir tamsayı döndürür.

UIColor böyle bir yöntemi yoktur, ancak filtreler oluşturarak kendi:

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

Kullanımı: UIColor bir tanımlanan olması durumunda bu sadece çalışacağını

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

Not "RGB uyumlu" renk alanı (RGB, HSB veya GrayScale gibi). Renk CIColor veya desen görüntüden oluşturulmuşsa başarısız olabilir, bu durumda nil döndürülür.

Not: @ vonox7 fark olarak, dönen bir değer (ayrıca Java getRGB() yöntemle durumda), 32-bit platformlarda negatif olabilir. Bu istenmiyorsa, Int'u UInt veya Int64 ile değiştirin. Martin R'ın cevap itibaren

+0

Çok teşekkürler. Bu benim aradığım şey. Muhtemelen aynı sırtın var mı?(Hızlı bir şekilde yeniyim) -> getRed (iRGBValue: Int) -> Int? –

+1

@ user1344545: Sorunuzu doğru anladığımdan emin değilim. Bileşenleri rgb değerinden basit shift + mask işlemleriyle, örneğin '' red red = (rgb >> 16) & 0xFF' ile çıkarabilirsiniz. Ancak, değerleri ayrı olarak istiyorsanız, yukarıdaki yöntemde olduğu gibi iRed, iGreen, iBlue, iAlpha'yı hesaplamak ve bunları tek bir sayı ile birleştirmek daha kolay olacaktır. –

+0

Doğru anladınız. Kırmızıya bakalım = (rgb >> 16) & 0xFF aradığım şey. Çok teşekkür ederim ! –

34

: yöntem, aynı zamanda adlandırılmış başlığın (a Swift 2 özelliği) geri dönebilirler:

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

Bu cevabı daha çok beğeniyorum. Daha bilgilendirici ve daha kullanıma hazır. :) Teşekkürler! –

+0

Alfa bileşeninin '255.0' ile çarpılmaması ve son tuple bileşeninin "Double" türünde olması gerektiği görülüyor. –

+0

Neden alfa'yı 255 ile çarpmazsınız? Int' i tekrar döndürüyorsanız ve 255 ile çarpmadığınız takdirde, her ikisi de pratik olarak görünmeyen 0 veya 1 elde edersiniz. UIColor UIColor (beyaz: CGFloat, alpha: CGFloat) 2 parametre init'i kullanılarak oluşturulan UIColor.white renk ise – user1118321

18

Swift 3.0 IOS 10

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

kullanabileceğiniz bir uzantı yazdı. CGFloat UIColor ait init metodu

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

Not gerekenlere çünkü CGFloat s yerine Int s olarak değerler döndürmek için seçti: Swift 3.1/uyumlu iOS 10, UIColor.cgColor olarak iOS 9'da çalışmayabilir. bileşenleri UIColor dan hex kodunu (uint) alınıyor

+4

çöküyor. 4 yerine iki parametre gösterir ve aralık dışı bir istisna oluşur – DatForis

0

Swift 4. bulunmayabilir edilebilir: swift RGB Renk almak için, Renk değişmezi kullanabilirsiniz yılında

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

. Sadece bu birine yararlı olacağını düşündüğümüz

enter image description here

gibi

enter image description here

.