2015-02-15 24 views
21

Ho visto persone farlo in oggettivo-c, ma ho problemi con questo in modo rapido. Ho ottenuto il colore di un pixel da un'immagine, ma ora ho bisogno di prendere i singoli valori rosso, verde e blu. Ecco quello che ho (h, w, e RGB sono numeri interi e image.getPixelColor (CGPoint) restituisce un UIColor):Estrarre valori RGB da UIColor

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

Come posso cambiare questa UIColor nei valori di rosso, verde e blu? Grazie!

risposta

49

È possibile convertire UIColor a CIColor e quindi estrarre i componenti di colore da esso come segue:

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

utilizzo:

012.351.641.061.
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 


È inoltre possibile utilizzare la funzione getRed() e creare un'estensione per estrarre i componenti come segue, ma il risultato sarebbe facoltativo:

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

Uso

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

Perché creare 4 istanze 'CIColor'? Creane uno, assegnalo a una variabile e prendi i 4 componenti da esso. – rmaddy

+1

Qualcuno può spiegare esattamente come funziona? Immagino che "componenti" siano una tupla che contiene gli elementi. Ma qual è il resto? Qualche tipo di funzione-ish? – netigger

+0

Ho capito. Il suo "Impostazione di un valore di proprietà predefinito con una chiusura o funzione" da https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097- CH18-ID232 – netigger

1

Non testato ma questo dovrebbe funzionare. Appena trovato:

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

È possibile utilizzare CGColorGetComponents per ottenere gamma di colore di un CGColor (non testato nel swift3)

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

È possibile trovare anche il numero dei componenti di colore di quel colore con

CGColorGetNumberOfComponents 

È necessario verificare il numero di componenti prima di ottenere valori. colore grigio ha 2 componenti (grigio & alfa), colori RGB avere 4 componenti: R, G, B, A

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

+1

Non presupporre che ci siano 4 componenti di colore. – rmaddy

+0

Questo è per il colore RGB (eccetto bianco e nero che è di colore grigio?). Normalmente, un RGB ha 4 componenti: R, G, B, Alpha. –

+0

Questo non funziona più in Swift 3. –

12

per UIColor si può usare metodo 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)") 
+2

Questa dovrebbe essere la risposta accettata –

+0

Accetto. Questo è il modo migliore per estrarre i valori RGBA. Opzione eccellente se è necessario modificare uno di essi. Voti! – MLBDG