Как изменить оттенок, яркость и насыщенность 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(&currentHue, saturation: &currentSaturation, brightness: &currentBrigthness, alpha: &currentAlpha){
            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(&currentHue, saturation: &currentSaturation, brightness: &currentBrigthness, alpha: &currentAlpha) {
            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];

Ответ 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];