如何从Swift中的UIColor获取RGB代码(INT)

mcf*_*oft 52 rgb uicolor swift

我想在Swift中获得UIColor的RGB值:

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

在Java中我会这样做:

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

我应该如何获得这个价值?

Mar*_*n R 81

Java getRGB() 返回一个整数,表示默认sRGB颜色空间中的颜色(位24-31是alpha,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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

请注意,只有UIColor在"RGB兼容"颜色空间(如RGB,HSB或GrayScale)中定义时,才能使用此功能.如果从一个CIColor或一个图案图像创建了颜色,则可能会失败,在这种情况下nil返回.

备注:正如@ vonox7注意到的那样,返回的值在32位平台上可能是负值(Java getRGB()方法也是如此).如果不希望如此,更换IntUIntInt64.

  • @ user1344545:我不确定我是否正确理解您的问题。您可以使用简单的 shift+m​​ask 操作从 rgb 值中提取组件,例如 `let red = (rgb &gt;&gt; 16) &amp; 0xFF`。但是如果你想要单独的值,那么像上面的方法一样只计算 iRed、iGreen、iBlue、iAlpha 而不是将它们组合成一个数字会更容易。 (2认同)

Mat*_*ler 49

来自Martin R的回答:该方法还可以返回一个命名元组(一个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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*232 32

Swift 3.0 IOS 10

let colour = UIColor.red
let rgbColour = colour.cgColor
let rgbColours = rgbColour.components
Run Code Online (Sandbox Code Playgroud)


Zac*_*iro 6

写了一个你可以使用的扩展.我选择将值作为CGFloats而不是Ints 返回,因为这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]
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:Swift 3.1/iOS 10兼容,可能无法在iOS 9中工作,因为UIColor.cgColor.components可能无法使用

  • 崩溃,如果颜色是UIColor.white,我假设是使用UIColor UIColor的2参数init(白色:CGFloat,alpha:CGFloat)构建的.显示为两个参数而不是4,并且发生索引超出范围异常 (5认同)

bir*_*rdy 5

Swift 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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么 ``+ 0.5``` ? (3认同)