web-dev-qa-db-fra.com

Extraire les valeurs RVB de UIColor

J'ai vu des gens faire ça en objectif-c, mais j'ai du mal avec ça dans Swift. J'ai obtenu la couleur d'un pixel d'une image, mais maintenant je dois prendre les valeurs individuelles de rouge, vert et bleu. Voici ce que j'ai (h, w et rgb sont des entiers et image.getPixelColor (CGPoint) renvoie un UIColor):

 xArry[h][w][rgb] = image.getPixelColor(CGPoint(x: w, y: h))

Comment changer cette UIColor en valeurs rouge, verte et bleue? Merci!

23
Kendel

Vous pouvez convertir UIColor en CIColor, puis en extraire les composants de couleur comme suit:

Mise à jour: Xcode 8.3.2 • Swift 3.1

extension UIColor {
    var coreImageColor: CIColor {
        return CIColor(color: self)
    }
    var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        let coreImageColor = self.coreImageColor
        return (coreImageColor.red, coreImageColor.green, coreImageColor.blue, coreImageColor.alpha)
    }
}

usage:

let myColor = UIColor(red: 0.5, green: 1, blue: 0.25, alpha: 0.5)
let myCIColor = myColor.coreImageColor
let greencomponent = myColor.components.green
let myColorComponents = myColor.components
print(myColorComponents.red)   // 0.5
print(myColorComponents.green) // 1.0
print(myColorComponents.blue)  // 0.25
print(myColorComponents.alpha) // 0.5


Vous pouvez également utiliser la fonction getRed () et créer une extension pour extraire les composants comme suit, mais le résultat serait facultatif:

extension UIColor {
    var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)? {
        var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
        return getRed(&r, green: &g, blue: &b, alpha: &a) ? (r,g,b,a) : nil
    }
}

Usage

let myColor = UIColor(red: 0.5, green: 1, blue: 0.25, alpha: 0.5)
if let myColorComponents = myColor.components {
    print(myColorComponents.red)   // 0.5
    print(myColorComponents.green) // 1.0
    print(myColorComponents.blue)  // 0.25
    print(myColorComponents.alpha) // 0.5
}
50
Leo Dabus

pour UIColor, vous pouvez simplement utiliser la méthode getRed:

let yourColor = UIColor(red: 0/255, green: 184/255, blue: 48/255, alpha: 1.0)
var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
yourColor.getRed(&r, green: &g, blue: &b, alpha: &a)
print("red: \(r), green: \(g), blue: \(b)")
18

Vous pouvez utiliser CGColorGetComponents pour obtenir un tableau de couleurs d'un CGColor (non testé dans Swift3)

const CGFloat *_components = CGColorGetComponents(yourUIColor.CGColor);
    CGFloat red     = _components[0];
    CGFloat green = _components[1];
    CGFloat blue   = _components[2];
    CGFloat alpha = _components[3];

Vous pouvez également trouver le nombre de composants de couleur de cette couleur avec

CGColorGetNumberOfComponents

Vous devez vérifier le nombre de composants avant d'obtenir des valeurs. La couleur grise a 2 composants (gris et alpha), les couleurs RVB ont 4 composants: R, G, B, A

https://developer.Apple.com/library/ios/documentation/GraphicsImaging/Reference/CGColor/index.html#//Apple_ref/c/func/CGColorGetNumberOfComponents

4
Duyen-Hoa

Non testé mais cela devrait fonctionner. Je viens de le trouver:

   xArry[h][w][rgb] = Int(image.getPixelColor(CGPoint(x: w, y: h)).CIColor.red())
1
Kendel