Как изменить оттенок, яркость и насыщенность UIColor?
Допустим, у меня есть UIColor
UIColor *color = [UIColor redColor];
Теперь я хочу изменить насыщенность/оттенок/brigthness, как мне это сделать?
Я прочитал документацию, но я все еще очень смущен.
Я хочу изменить UIColor, который я сделал ([UIColor redColor]), не инициирует новый цвет с некоторыми настройками. Как изменить его, сохраняя оригинал. Я знаю о методе colorWithHue:saturation:brightness:alpha:
, мне нужно обновить существующие цветовые свойства, сохраняя красный цвет.
Ответы
Ответ 1
Вы можете вызвать getHue:saturation:brightness:alpha:
на свой цвет, затем отрегулировать значения, а затем создать новый цвет с помощью настроенных компонентов с помощью +[UIColor colorWithHue:saturation:brightness:alpha:]
CGFloat hue, saturation, brightness, alpha ;
BOOL ok = [ <color> getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha ] ;
if ( !ok ) {
// handle error
}
// ... adjust components..
UIColor * newColor = [ UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha ] ;
Ответ 2
Ниже приведено быстрое расширение UIColor
:
extension UIColor {
func modified(withAdditionalHue hue: CGFloat, additionalSaturation: CGFloat, additionalBrightness: CGFloat) -> UIColor {
var currentHue: CGFloat = 0.0
var currentSaturation: CGFloat = 0.0
var currentBrigthness: CGFloat = 0.0
var currentAlpha: CGFloat = 0.0
if self.getHue(¤tHue, saturation: ¤tSaturation, brightness: ¤tBrigthness, alpha: ¤tAlpha){
return UIColor(hue: currentHue + hue,
saturation: currentSaturation + additionalSaturation,
brightness: currentBrigthness + additionalBrightness,
alpha: currentAlpha)
} else {
return self
}
}
}
Ответ 3
К сожалению, он довольно хлопот, чтобы поменять любые значения hsba
или rgba
UIColor по умолчанию. Используя HandyUIKit (установите его через Карфаген) значительно упростит вашу жизнь
import HandyUIKit
// each line creates a new UIColor object with the new value
color.change(.hue, to: 0.1)
color.change(.brightness, to: 0.2)
color.change(.saturation, to: 0.3)
color.change(.alpha, to: 0.4)
// chaining them returns a single new object with all values changed
color.change(.hue, to: 0.5)
.change(.brightness, to: 0.6)
.change(.saturation, to: 0.7)
Существуют также варианты применения относительных изменений:
// create a new UIColor object with hue & brightness increased by 0.2
color.change(.hue, by: 0.2)
.change(.brightness, by: 0.2)
Библиотека также добавляет в ваш проект некоторые другие удобные функции пользовательского интерфейса - ознакомьтесь с его README на GitHub для более подробной информации.
Надеюсь, это поможет!
Ответ 4
Одно важное замечание, еще не упомянутое здесь, - то, что ваш UIColor должен быть в расширенном пространстве RGB. В зависимости от того, как изначально был создан ваш цвет, эта функция может возвращать значение false, если это просто RGB.
Во-вторых, я сделал вариант ответа @ambientlight, чтобы API стал немного более привлекательным. Вы можете настроить 1 или все свойства.
extension UIColor {
public func adjust(hueBy hue: CGFloat = 0, saturationBy saturation: CGFloat = 0, brightnessBy brightness: CGFloat = 0) -> UIColor {
var currentHue: CGFloat = 0.0
var currentSaturation: CGFloat = 0.0
var currentBrigthness: CGFloat = 0.0
var currentAlpha: CGFloat = 0.0
if getHue(¤tHue, saturation: ¤tSaturation, brightness: ¤tBrigthness, alpha: ¤tAlpha) {
return UIColor(hue: currentHue + hue,
saturation: currentSaturation + saturation,
brightness: currentBrigthness + brightness,
alpha: currentAlpha)
} else {
return self
}
}
}
Ответ 5
Этот метод можно использовать, установив следующие значения
UIColor *customColor = [UIColor colorWithHue: x.xx saturation: x.xx brightness: x.xx alpha: 1.0];
Ответ 6
http://developer.apple.com/library/ios/#documentation/uikit/reference/UIColor_Class/Reference/Reference.html
Существует функция класса с colorWithHue:saturation:brightness:alpha:
Конечно, вы можете сначала использовать getHue:saturation:brightness:alpha:
, прежде чем вносить какие-либо изменения, когда вы начинаете с [UIColor redColor]
Ответ 7
CGSize imageSize = [ba size];
CGRect imageExtent = CGRectMake(0,0,imageSize.width,imageSize.height);
// Create a context containing the image.
UIGraphicsBeginImageContext(imageSize);
CGContextRef context = UIGraphicsGetCurrentContext();
[sourceimage drawInRect:imageExtent];
// Draw the hue on top of the image.
CGContextSetBlendMode(context, kCGBlendModeHue);
[[UIColor colorWithHue:yourvalue saturation:1.0 brightness:1 alpha:1.0] set];
UIBezierPath *imagePath = [UIBezierPath bezierPathWithRect:imageExtent];
[imagePath fill];
CGImageRef imageref=CGBitmapContextCreateImage(context);
UIImage *result =[UIImage imageWithCGImage:imageref];
CGImageRelease(imageref);
В первых двух строках он описывает размер изображения и прямоугольник изображения. CGContextRef
используется для создания контекста в основной графике. После этого 5-я строка - это изображение, которое вы хотите применить к оттенку и прямоугольнику изображения. После этого режим смешивания, который важен. После этого UI colorWithHue
, в котором передаются значения оттенка, насыщенности, яркости и альфы. Чтобы получить надлежащий эффект, дайте 1.0 значение альфа. И в конце вы должны установить uicolor.create
bezerpath, или вы можете напрямую дать cgcontextsetfill(context)
. В конце создайте imageref
и поместите это изображение в UIImage
. В конце, как всегда в хореографии, отпустите CGImageRelease
для хеджирования из-за проблем с памятью.
Ответ 8
Вы можете просто изменить это на
[UIColor colorWithHue:YourHueValue saturation:YourSaturationValue brightness:YourBrightnessValueValue alpha:1.00];
alpha обозначает непрозрачность вида, и она колеблется от 0.0 до 1.0
Ответ 9
UIColor не может изменить насыщенность/оттенок/яркость, вы можете CoreImage.
Пример кода ниже:
CIFilter *filter = [CIFilter filterWithName:@"CIColorControls"];
[filter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputContrast"];
[filter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputSaturation"];
[filter setValue:[NSNumber numberWithFloat:0.0] forKey:@"inputBrightness"];
[filter setValue:_A_CIImage_ forKey:kCIInputImageKey];
CIImage *_outputImage = filter.outputImage;
CIContext context = [CIContext contextWithOptions:nil];
CGImageRef outputImageRef = [context createCGImage: _outputImage fromRect:[_outputImage extent]];
Ответ 10
[UIColor colorWithHue:0.10 saturation:0.16 brightness:0.13 alpha:1.00];