如何从 Swift 中的 UIColor 获取 RGB 代码(INT)[重复]

Posted

技术标签:

【中文标题】如何从 Swift 中的 UIColor 获取 RGB 代码(INT)[重复]【英文标题】:How to get the RGB Code (INT) from an UIColor in Swift [duplicate] 【发布时间】:2015-04-23 00:53:14 【问题描述】:

我想在 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);

我应该如何获得这个值?

【问题讨论】:

【参考方案1】:

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")

请注意,这仅在 UIColor 已在 “RGB 兼容”色彩空间(例如 RGB、HSB 或灰度)。有可能 如果颜色是从 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)
    

【讨论】:

非常感谢。这就是我搜索的内容。你可能有同样的背部? (我是 swift 的新手)-> getRed(iRGBValue:Int) -> Int ? @user1344545:我不确定我是否正确理解了您的问题。您可以使用简单的 shift+m​​ask 操作从 rgb 值中提取分量,例如let red = (rgb &gt;&gt; 16) &amp; 0xFF。但是如果你想要单独的值,那么像上面的方法一样只计算 iRed、iGreen、iBlue、iAlpha 而不是将它们组合成一个数字会更容易。 你理解正确。 let red = (rgb >> 16) & 0xFF 是我要找的。非常感谢! 请注意,此代码在 32 位设备上返回错误值!每个Int 都必须替换为Int64 @vonox7:返回值确实可以是负数。 (我假设问题中提到的 Java getRGB 方法的行为相同。)但是我添加了一条注释来澄清这一点,感谢您的反馈!【参考方案2】:

来自 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
        
    

【讨论】:

我更喜欢这个答案。它的信息量更大,更易于使用。 :) 谢谢! 看来 alpha 分量不应该乘以 255.0 并且最后一个元组分量应该是 Double 类型。 为什么不将 alpha 乘以 255?如果您返回 Int,并且不乘以 255,则只会得到 0 或 1,这两者实际上都是不可见的。【参考方案3】:

Swift 3.0 ios 10

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

【讨论】:

【参考方案4】:

写了一个你可以使用的扩展。我选择将值返回为 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]
        )
    

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

【讨论】:

如果颜色是 UIColor.white 则崩溃,我假设它是使用 UIColor UIColor 的 2 参数 init 构建的(白色:CGFloat,alpha:CGFloat)。显示为两个参数而不是 4,并且出现索引超出范围异常【参考方案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
    

【讨论】:

为什么是+ 0.5【参考方案6】:

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

就这样

我希望这对某人有用。

【讨论】:

【参考方案7】:

看起来它在最近的版本中变得更简单了,值是 0-1,所以它们需要 * 255 才能获得标准 rbga 结果(a 除外)

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

【讨论】:

以上是关于如何从 Swift 中的 UIColor 获取 RGB 代码(INT)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在现有 UIKit 类(如 UIColor)的扩展中添加初始化程序?

如何在 Swift 中创建十六进制颜色字符串 UIColor 初始化程序? [复制]

为给定的 UIColor 获取更亮和更暗的颜色变化

如何从 UIColor 对象中获取红绿蓝 (RGB) 和 alpha?

UIColor swift 扩展,带有来自 Objective-C 的类访问

UIView 的神秘 UIColor 行为以及 Swift 中的一般行为