2015-02-21 17 views
41

Tôi muốn để có được giá trị RGB của một UIColor trong Swift:Làm thế nào để lấy Mã RGB (INT) từ một UIColor trong Swift

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

Trong Java Tôi sẽ làm điều đó như sau:

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

Tôi nên nhận giá trị này như thế nào?

Trả lời

65

Java getRGB() trả về một số nguyên thể hiện màu trong không gian màu sRGB mặc định (bit 24-31 là alpha, 16-23 là màu đỏ, 8-15 có màu xanh lá cây, 0-7 là màu xanh dương).

UIColor không có một phương pháp như vậy, nhưng bạn có thể định nghĩa của riêng bạn:

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

Cách sử dụng:

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

Lưu ý rằng điều này sẽ chỉ làm việc nếu UIColor đã được định nghĩa trong một Không gian màu "tương thích RGB" (chẳng hạn như RGB, HSB hoặc GrayScale). Nó có thể không thành công nếu màu đã được tạo từ một hình ảnh CIColor hoặc hình ảnh , trong trường hợp đó, nil được trả về.

Ghi chú: Như @ vonox7 nhận thấy, giá trị trả về có thể là tiêu cực trên nền tảng 32-bit (mà cũng là trường hợp với các phương pháp Java getRGB()). Nếu không muốn, thay thế Int bằng UInt hoặc Int64.

+0

Cảm ơn rất nhiều. Đó là những gì tôi đã tìm kiếm. Bạn có thể có cùng một trở lại?(Tôi rất mới nhanh) -> getRed (iRGBValue: Int) -> Int? –

+1

@ user1344545: Tôi không chắc chắn nếu tôi hiểu câu hỏi của bạn một cách chính xác. Bạn có thể trích xuất các thành phần từ giá trị rgb bằng thao tác shift + mask đơn giản, ví dụ 'let red = (rgb >> 16) & 0xFF'. Nhưng nếu bạn muốn các giá trị một cách riêng biệt, sau đó nó sẽ được dễ dàng hơn để chỉ tính iRed, iGreen, iBlue, iAlpha như trong phương pháp trên và không kết hợp chúng với một số duy nhất. –

+0

Bạn đã hiểu chính xác. let red = (rgb >> 16) & 0xFF là những gì tôi tìm kiếm. Cảm ơn bạn rất nhiều ! –

34

Từ câu trả lời Martin R: Phương pháp này cũng có thể trả về một tuple tên (một tính năng Swift 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

Tôi thích câu trả lời này tốt hơn. Đó là thông tin nhiều hơn và sẵn sàng hơn để sử dụng. :) Cảm ơn! –

+0

Có vẻ như thành phần alpha không được nhân với '255.0' và thành phần tuple cuối cùng phải thuộc loại' Double'. –

+0

Tại sao bạn không nhân alpha với 255? Nếu bạn đang quay trở lại 'Int', và bạn không nhân với 255, bạn sẽ chỉ nhận được 0 hoặc 1, cả hai đều là vô hình. – user1118321

18

Swift 3,0 IOS 10

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

Wrote một phần mở rộng bạn có thể sử dụng. Tôi đã chọn để trả lại giá trị như CGFloat s chứ không phải Int s vì CGFloat là những gì các phương pháp init của UIColor mất

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

Lưu ý: Swift 3.1/iOS 10 tương thích, có thể không hoạt động trong iOS 9 như UIColor.cgColor. các thành phần có thể không có sẵn

+4

treo nếu màu là UIColor.white mà tôi giả sử được xây dựng bằng cách sử dụng tham số 2 init của UIColor UIColor (trắng: CGFloat, alpha: CGFloat). Hiển thị dưới dạng hai thông số thay vì 4 và một chỉ mục ngoài phạm vi ngoại lệ xảy ra – DatForis

0

Swift 4. Bắt mã hex (uINT) từ UIColor:

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

Trong nhanh chóng bạn có thể sử dụng màu Literal, để có được màu RGB.

enter image description here

Chỉ cần như thế

enter image description here

Tôi hy vọng điều này sẽ hữu ích cho một ai đó.

Các vấn đề liên quan