2015-02-15 40 views
21

Widziałem, jak ludzie robili to w obiektywny sposób, ale mam z tym kłopot w szybkim tempie. Dostałem kolor piksela z obrazu, ale teraz muszę wziąć indywidualne wartości czerwone, zielone i niebieskie. Oto co mam (H, W, i RGB są liczbami całkowitymi i image.getPixelColor (CGPoint) zwraca UIColor):Wyodrębnij wartości RGB Od UIColor

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

Jak mogę zmienić UIColor do czerwonego, zielonego i niebieskiego wartości? Dzięki!

Odpowiedz

49

można przekształcić UIColor do CIColor a następnie wyodrębnić składowych koloru z tego jak następuje:

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

wykorzystanie:

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 


Można również użyć funkcji getRed() i utworzyć rozszerzenie wyodrębnić składniki następująco ale wynik będzie opcjonalnie:

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

Wykorzystanie

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

Po co tworzyć 4 wystąpienia "CIColor"? Utwórz jedną, przypisz ją do zmiennej i pobierz z niej 4 komponenty. – rmaddy

+1

Czy ktoś może wyjaśnić dokładnie, jak to działa? Zgaduję, że "komponenty" to krotka, która zawiera elementy. Ale co reszta? Jakiś rodzaj funkcji? – netigger

+0

Mam to. Jego "Ustawienie domyślnej wartości właściwości z zamknięciem lub funkcją" z https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097- CH18-ID232 – netigger

1

Nieprześcigniony, ale to powinno zadziałać. Właśnie znalazłem go:

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

Można użyć CGColorGetComponents dostać tablicę koloru CGColor (nie testowane swift3)

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

można znaleźć również szereg składników barwnych tego koloru z

CGColorGetNumberOfComponents 

Musisz zweryfikować liczbę komponentów, zanim uzyskasz wartości. Szary kolor zawiera 2 składniki (szara & alfa), kolorów rgb ma 4 części: R, G, B,

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

+1

Nie zakładaj, że są 4 komponenty koloru. – rmaddy

+0

Dotyczy kolorów RGB (z wyjątkiem białych i czarnych, które są w kolorze szarym?). Zwykle RGB ma 4 komponenty: R, G, B, Alpha. –

+0

To już nie działa w Swift 3. –

12

dla UIColor można po prostu użyć Metoda 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

To powinno być zaakceptowaną odpowiedzią –

+0

Zgadzam się. Jest to najlepszy sposób na wyciągnięcie wartości RGBA. Doskonała opcja, jeśli musisz zmodyfikować jedną z nich. Głosy w górę! – MLBDG