2015-02-15 11 views
21

Ich habe Leute in objective-c gesehen, aber ich habe Probleme damit. Ich habe die Farbe eines Pixels aus einem Bild erhalten, aber jetzt muss ich die einzelnen Werte für Rot, Grün und Blau nehmen. Hier ist, was ich habe (h, w, und rgb ganze Zahlen sind und image.getPixelColor (CGPoint) gibt einen UIColor):RGB-Werte aus UIColor extrahieren

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

Wie ändere ich diesen UIColor in die roten, grünen und blauen Werte? Vielen Dank!

Antwort

49

Sie UIColor zu CIColor umwandeln kann, und dann die Farbkomponenten daraus wie folgt extrahiert:

Update: 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) 
    } 
} 

Nutzung:

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 


Sie können auch die Funktion getRed() verwenden, und eine Erweiterung erstellen, die Komponenten wie folgt zu extrahieren, aber das Ergebnis wäre optional:

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

Nutzungs

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

Warum 4 'CIColor' Instanzen erstellen? Erstellen Sie einen, weisen Sie ihn einer Variablen zu und holen Sie sich die 4 Komponenten daraus. – rmaddy

+1

Kann jemand genau erklären, wie das funktioniert? Ich denke, "Komponenten" ist ein Tupel, das die Elemente enthält. Aber was ist der Rest? Eine Art von Funktion-Ish? – netigger

+0

Ich habe es. Sein "Festlegen eines Standardeigenschaftswerts mit einer Schließung oder Funktion" von https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097- CH18-ID232 – netigger

1

Nicht getestet, aber dies sollte funktionieren. Nur fand es:

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

Sie CGColorGetComponents Array von Farbe eines CGColor bekommen können (nicht in swift3 getestet)

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

Sie auch Anzahl der Farbkomponenten dieser Farbe mit

finden
CGColorGetNumberOfComponents 

Sie müssen die Anzahl der Komponenten überprüfen, bevor Werte abgerufen werden. Graue Farbe hat 2 Komponenten (grau & alpha), RGB-Farben haben 4 Komponenten: R, G, B, A

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

+1

Gehen Sie nicht davon aus, dass es 4 Farbkomponenten gibt. – rmaddy

+0

Dies ist für RGB-Farbe (außer weiß und schwarz, das ist graue Farbe?). Normalerweise hat ein RGB 4 Komponenten: R, G, B, Alpha. –

+0

Dies funktioniert nicht mehr in Swift 3. –

12

für UIColor können Sie einfach verwenden getRed-Methode:

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

Dies sollte wirklich die akzeptierte Antwort sein –

+0

Zustimmen. Dies ist der beste Weg, um RGBA-Werte zu extrahieren. Ausgezeichnete Option, wenn Sie eine von ihnen ändern müssen. Stimmen hoch! – MLBDG