Извлечение значений RGB из UIColor
Я видел, как люди делают это в objective-c, но у меня проблемы с этим в swift. Я получил цвет пикселя от изображения, но теперь мне нужно взять отдельные красные, зеленые и синие значения. Вот что у меня есть (h, w и rgb-целые числа и изображение.getPixelColor (CGPoint) возвращает UIColor):
xArry[h][w][rgb] = image.getPixelColor(CGPoint(x: w, y: h))
Как изменить этот UIColor на красный, зеленый и синий значения? Спасибо!
4 ответов
вы можете преобразовать UIColor в CIColor, а затем извлечь из него компоненты цвета следующим образом:
обновление: 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)
}
}
использование:
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
вы также можете использовать функцию getRed () и создать расширение для извлечения компонентов следующим образом, но результат будет необязательным:
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
}
}
использование
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
}
для UIColor вы можете просто использовать метод 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)")
Вы можете использовать CGColorGetComponents, чтобы получить массив цвета CGColor (не протестирован в swift3)
const CGFloat *_components = CGColorGetComponents(yourUIColor.CGColor);
CGFloat red = _components[0];
CGFloat green = _components[1];
CGFloat blue = _components[2];
CGFloat alpha = _components[3];
вы можете найти также количество цветовых компонентов этого цвета с
CGColorGetNumberOfComponents
перед получением значений необходимо проверить количество компонентов. Серый цвет имеет 2 компонента( серый & Альфа), цвета rgb имеют 4 компонента: R, G, B, А
непроверенные, но это должно работать. Только что нашел:
xArry[h][w][rgb] = Int(image.getPixelColor(CGPoint(x: w, y: h)).CIColor.red())