web-dev-qa-db-fra.com

Comment obtenir le code RVB (INT) d’une UIColor dans Swift

Je souhaite obtenir la valeur RVB d'un UIColor dans Swift:

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

Dans Java je le ferais comme suit:

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

Comment devrais-je obtenir cette valeur?

51
mcfly soft

Le Java getRGB() ) renvoie un entier représentant la couleur dans l'espace colorimétrique sRGB par défaut (les bits 24 à 31 sont alpha, 16 à 23 sont rouges). , 8-15 sont en vert, 0-7 sont en bleu).

UIColor ne dispose pas d'une telle méthode, mais vous pouvez définir la vôtre:

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

Usage:

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

Notez que cela ne fonctionnera que si UIColor a été défini dans un espace colorimétrique "compatible RGB" (tel que RGB, HSB ou GrayScale). Il peut échouer si la couleur a été créée à partir d'un CIColor ou d'une image de motif. Dans ce cas, nil est renvoyé.

Remarque: Comme @ vonox7 l’a remarqué, la valeur renvoyée peut être négative sur les plates-formes 32 bits (ce qui est également le cas avec le Java getRGB() méthode) .Si cela n'est pas voulu, remplacez Int par UInt ou Int64.

La conversion inverse est

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)
    }
}
80
Martin R

Réponse de Martin R: La méthode pourrait également renvoyer un tuple nommé (a 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
        }
    }
}
46
Matthieu Riegler

Swift 3.0 IOS 10

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

Écrit une extension que vous pouvez utiliser. J'ai choisi de renvoyer les valeurs sous la forme CGFloats plutôt que Ints parce que CGFloat correspond à la méthode init de UIColor.

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

Remarque: Swift 3.1/iOS 10, risque de ne pas fonctionner sous iOS 9, car UIColor.cgColor.components pourrait ne pas être disponible.

5
Zack Shapiro

Swift 4. Obtenir le code hexadécimal (UInt) d’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
    }
}
3
birdy

Dans Swift, vous pouvez utiliser Color Literal pour obtenir des couleurs RVB.

enter image description here

Juste comme ça

enter image description here

J'espère que cela sera utile à quelqu'un.

3
Booharin