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

62

我想在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 ?
在Java中,我会按照以下方式完成:
Color cnew = new Color();
int iColor = cnew.rgb(1, 165/255, 0);
System.out.println(iColor);

我应该如何获取这个值?

7个回答

97

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

用法:

let swiftColor = UIColor(red: 1, green: 165/255, blue: 0, alpha: 1)
if let rgb = swiftColor.rgb() {
    print(rgb)
} else {
    print("conversion failed")
}
请注意,这仅适用于在“RGB兼容”颜色空间(例如RGB,HSB或GrayScale)中定义的UIColor。如果颜色是从CIColor或图案图像创建的,则可能会失败,在这种情况下返回nil备注:如@vonox7所指出的那样,在32位平台上返回的值可能为负数(Java getRGB()方法也是如此)。如果不想要这种情况,请将Int替换为UIntInt64
反向转换为:
extension UIColor {
    convenience init(rgb: Int) {
        let iBlue = rgb & 0xFF
        let iGreen =  (rgb >> 8) & 0xFF
        let iRed =  (rgb >> 16) & 0xFF
        let iAlpha =  (rgb >> 24) & 0xFF
        self.init(red: CGFloat(iRed)/255, green: CGFloat(iGreen)/255,
                  blue: CGFloat(iBlue)/255, alpha: CGFloat(iAlpha)/255)
    }
}

2
@user1344545:我不确定我是否正确理解了你的问题。你可以通过简单的移位+掩码操作从rgb值中提取组件,例如 let red = (rgb >> 16) & 0xFF。但是,如果你想要分别得到这些值,那么按照上述方法计算iRed、iGreen、iBlue、iAlpha会更容易,而不是将它们组合成一个数字。 - Martin R
你理解得很正确。let red = (rgb >> 16) & 0xFF 就是我要找的。非常感谢! - mcfly soft
请注意,此代码在32位设备上返回错误值!每个“Int”都必须替换为“Int64”。 - vonox7
@MartinR 我已经将所有的 Int 替换为 Int64,但是我得到了太大的值。例如,我得到了 4288243251,转换为十六进制值为 FF996633,这不是一个有效的十六进制颜色代码(应该是6个数字)。有什么想法吗? - Centurion
@Centurion:最重要的8位比特保存了Alpha值,在你的情况下0xFF = 255对应于Alpha = 1.0。这是不透明颜色的正常值。 - Martin R
显示剩余4条评论

61

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

我更喜欢这个答案。它更具信息量和可操作性。 :) 谢谢! - Chen Li Yong
似乎 alpha 组件不应该乘以 255.0,最后一个元组组件应该是 Double 类型。 - Yevhen Dubinin
为什么不将 alpha 乘以 255 呢?如果你返回的是 Int,而且没有乘以 255,那么你只会得到 0 或 1,这两个数字几乎看不见。 - user1118321

36

Swift 3.0 IOS 10

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

7

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

3
为什么要加上+ 0.5 - LetsGoBrandon

6

我写了一个扩展,你可以使用它。我选择将值作为CGFloat而不是Int返回,因为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]
        )
    }
}

注意:Swift 3.1/iOS 10 兼容,可能在iOS 9上不适用,因为 UIColor.cgColor.components 可能无法使用。

11
如果颜色是UIColor.white,则会导致崩溃,我认为这是使用UIColor的两个参数init方法构建的UIColor(white: CGFloat, alpha: CGFloat)。它显示为两个参数而不是4个参数,并且会出现索引超出范围的异常。 - DatForis

2

在Swift中,您可以使用Color Literal来获取RGB颜色。

enter image description here

就像那样

enter image description here

我希望这对某个人有用。


0

最近的版本似乎变得更简单了,值为0-1,因此需要将它们* 255以获得标准的RGBA结果(除了a)

let red = yourColor.lottieColorValue.r * 255
let blue= yourColor.lottieColorValue.b * 255
let green= yourColor.lottieColorValue.g * 255
let alpha = yourColor.lottieColorValue.a

1
我认为这需要安装Lottie包。 - Abdurrahman Mubeen Ali
我已经安装了Lottie,所以这个非常有帮助! - Michael Montalbano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接