获得略微的UIColor亮和较暗的颜色(Get Slightly Lighter and Darke

2019-06-26 11:12发布

我一直在寻找能够把任何的UIColor成梯度。 我打算做到这一点的方法是使用核心图形绘制渐变。 我所试图做的是获得一种颜色,可以说:

[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];

并获得的UIColor这几个色调较暗和几个深浅打火机。 有谁知道如何做到这一点? 谢谢。

Answer 1:

- (UIColor *)lighterColorForColor:(UIColor *)c
{
    CGFloat r, g, b, a;
    if ([c getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MIN(r + 0.2, 1.0)
                               green:MIN(g + 0.2, 1.0)
                                blue:MIN(b + 0.2, 1.0)
                               alpha:a];
    return nil;
}

- (UIColor *)darkerColorForColor:(UIColor *)c
{
    CGFloat r, g, b, a;
    if ([c getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MAX(r - 0.2, 0.0)
                               green:MAX(g - 0.2, 0.0)
                                blue:MAX(b - 0.2, 0.0)
                               alpha:a];
    return nil;
}

使用这样的:

UIColor *baseColor = // however you obtain your color
UIColor *lighterColor = [self lighterColorForColor:baseColor];
UIColor *darkerColor = [self darkerColorForColor:baseColor];

编辑 :作为@Anchu Chimala指出,实现最大的灵活性,这些方法应该被实现为的UIColor类别。 此外,从@莱利的想法,它可能是一个更好的主意,使颜色proprtionally较暗或较亮,而不是增加或减去固定值。 作为@jrturton指出,这是没有必要操纵RGB分量; 这是更好地修改亮度属性本身。 总而言之:

@implementation UIColor (LightAndDark)

- (UIColor *)lighterColor
{
    CGFloat h, s, b, a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
        return [UIColor colorWithHue:h
                          saturation:s
                          brightness:MIN(b * 1.3, 1.0)
                               alpha:a];
    return nil;
}

- (UIColor *)darkerColor
{
    CGFloat h, s, b, a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
        return [UIColor colorWithHue:h
                          saturation:s
                          brightness:b * 0.75
                               alpha:a];
    return nil;
}
@end


Answer 2:

TL; DR:

迅速:

extension UIColor {

    var lighterColor: UIColor {
        return lighterColor(removeSaturation: 0.5, resultAlpha: -1)
    }

    func lighterColor(removeSaturation val: CGFloat, resultAlpha alpha: CGFloat) -> UIColor {
        var h: CGFloat = 0, s: CGFloat = 0
        var b: CGFloat = 0, a: CGFloat = 0

        guard getHue(&h, saturation: &s, brightness: &b, alpha: &a)
            else {return self}

        return UIColor(hue: h,
                       saturation: max(s - val, 0.0),
                       brightness: b,
                       alpha: alpha == -1 ? a : alpha)
    }
}

用法:

let lightColor = somethingDark.lighterColor

Objective-C的:

- (UIColor *)lighterColorRemoveSaturation:(CGFloat)removeS
                              resultAlpha:(CGFloat)alpha {
    CGFloat h,s,b,a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
        return [UIColor colorWithHue:h
                          saturation:MAX(s - removeS, 0.0)
                          brightness:b
                               alpha:alpha == -1? a:alpha];
    }
    return nil;
}

- (UIColor *)lighterColor {
    return [self lighterColorRemoveSaturation:0.5
                                  resultAlpha:-1];
}

@rchampourlier是对他为@ user529758(接受的答案)评论 - 的HSB(或HSV)和RGB解决方案为完全不同的结果。 RGB只是增加了(或者使颜色更接近)白色,HSB解决方案所带来的颜色更接近边缘的Brigtness规模 - 它基本上开始用黑色与纯色结束...

基本上,亮度(值),使颜色更弱或更接近黑色,在饱和度,可有效减少或多个接近白色...

正如在这里看到:

因此,解决方案,使颜色更亮实际(即接近白色...)将是使它的饱和值较小 ,导致此解决方案:

- (UIColor *)lighterColor {
    CGFloat h,s,b,a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
        return [UIColor colorWithHue:h
                          saturation:MAX(s - 0.3, 0.0)
                          brightness:b /*MIN(b * 1.3, 1.0)*/
                               alpha:a];
    }
    return nil;
}


Answer 3:

Swift universal extension for iOS and OS X, using getHue :

#if os(OSX)

    import Cocoa
    public  typealias PXColor = NSColor

    #else

    import UIKit
    public  typealias PXColor = UIColor

#endif

    extension PXColor {

    func lighter(amount : CGFloat = 0.25) -> PXColor {
        return hueColorWithBrightnessAmount(1 + amount)
    }

    func darker(amount : CGFloat = 0.25) -> PXColor {
        return hueColorWithBrightnessAmount(1 - amount)
    }

    private func hueColorWithBrightnessAmount(amount: CGFloat) -> PXColor {
        var hue         : CGFloat = 0
        var saturation  : CGFloat = 0
        var brightness  : CGFloat = 0
        var alpha       : CGFloat = 0

        #if os(iOS)

            if getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) {
                return PXColor( hue: hue,
                                saturation: saturation,
                                brightness: brightness * amount,
                                alpha: alpha )
            } else {
                return self
            }

            #else

            getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha)
            return PXColor( hue: hue,
                            saturation: saturation,
                            brightness: brightness * amount,
                            alpha: alpha )

        #endif

    }

}

Usage :

let color = UIColor(red: 0.5, green: 0.8, blue: 0.8, alpha: 1.0)
color.lighter(amount:0.5)
color.darker(amount:0.5)

OR (with the default values):

color.lighter()
color.darker()

Sample :



Answer 4:

user529758在斯威夫特的解决方案:

较深的颜色:

func darkerColorForColor(color: UIColor) -> UIColor {

       var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

       if color.getRed(&r, green: &g, blue: &b, alpha: &a){
           return UIColor(red: max(r - 0.2, 0.0), green: max(g - 0.2, 0.0), blue: max(b - 0.2, 0.0), alpha: a)
       }

       return UIColor()
}

打火机颜色:

func lighterColorForColor(color: UIColor) -> UIColor {

       var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

       if color.getRed(&r, green: &g, blue: &b, alpha: &a){
           return UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
       }

       return UIColor()
}


Answer 5:

我只是想给同样的结果,在RGB,比

  • 将用αx%的颜色在白色背景,以减轻
  • 将用αx%的颜色在黑色背景变暗

可以得到相同的结果,AFAIK,比挑选以梯度的颜色“颜色为白色”或“颜色为黑色”,在梯度大小的X%。

为此,道理很简单:

// UIColor+Mix.swift
import UIKit
extension UIColor {

    func mixLighter (amount: CGFloat = 0.25) -> UIColor {
        return mixWithColor(UIColor.white, amount:amount)
    }

    func mixDarker (amount: CGFloat = 0.25) -> UIColor {
        return mixWithColor(UIColor.black, amount:amount)
    }

    func mixWithColor(_ color: UIColor, amount: CGFloat = 0.25) -> UIColor {
        var r1     : CGFloat = 0
        var g1     : CGFloat = 0
        var b1     : CGFloat = 0
        var alpha1 : CGFloat = 0
        var r2     : CGFloat = 0
        var g2     : CGFloat = 0
        var b2     : CGFloat = 0
        var alpha2 : CGFloat = 0

        self.getRed (&r1, green: &g1, blue: &b1, alpha: &alpha1)
        color.getRed(&r2, green: &g2, blue: &b2, alpha: &alpha2)
        return UIColor( red:r1*(1.0-amount)+r2*amount,
                        green:g1*(1.0-amount)+g2*amount,
                        blue:b1*(1.0-amount)+b2*amount,
                        alpha: alpha1 )
    }
}

下面是一些例子颜色



Answer 6:

如果转换的RGB颜色的HSL颜色模型 ,那么您可以变化从超过L = 0.5(自然色)为L = 1.0(白色)L = 0.0(黑色)L =亮度分量。 UIColor不能直接处理HSL,但也有式用于将RGB < - > HSL。



Answer 7:

该解决方案中没有贴出相当工作了所有的颜色和色调,但后来我偶然发现这个库它提供了一套很好的实现扩展的UIColor的。

具体地说,它有一个减仓的功能作为其HSL实现的一部分: (UIColor *)lighten:(CGFloat)amount -这完美的作品。



Answer 8:

如果你想user529758的解决方案与灰色色调的工作(如[UIColor lightGrayColor][UIColor darkGrayColor]你必须提高它这样:

- (UIColor *)lighterColor
{
    CGFloat h, s, b, a;
    if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) {
        return [UIColor colorWithHue:h
                          saturation:s
                          brightness:MIN(b * 1.3, 1.0)
                               alpha:a];
    }

    CGFloat white, alpha;
    if ([self getWhite:&white alpha:&alpha]) {
        white = MIN(1.3*white, 1.0);
        return [UIColor colorWithWhite:white alpha:alpha];
    }

    return nil;
}

getHue:saturation:brightness:alpha失败(并返回false )在灰度调用时因此,您需要使用getWhite:alpha



Answer 9:

的UIColor延伸和固定lighterColorForColor

extension UIColor {
  class func darkerColorForColor(color: UIColor) -> UIColor {
    var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
    if color.getRed(&r, green: &g, blue: &b, alpha: &a){
      return UIColor(red: max(r - 0.2, 0.0), green: max(g - 0.2, 0.0), blue: max(b - 0.2, 0.0), alpha: a)
    }
    return UIColor()
  }

  class func lighterColorForColor(color: UIColor) -> UIColor {
    var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
    if color.getRed(&r, green: &g, blue: &b, alpha: &a){
      let tmpColor = UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
      println(tmpColor)
      return tmpColor
    }
    return UIColor()
  }
}


Answer 10:

在这个线程或者使用RGB颜色系统或者干脆所有其他的答案改变HSB系统的色调和亮度值 。 正如在详细解释这个伟大的博客文章使颜色变亮或变暗的正确的方法是改变其luminance值。 其他的答案中没有做到这一点。 如果你想要做的是正确的,然后用我的解决方案或阅读博客文章后写自己的


不幸的是这是相当 默认情况下更改任何一个的UIColor属性的麻烦 。 此外苹果甚至不支持类似HCL任何基于LAB色彩空间UIColor类( L的实验室是luminance ,我们正在寻找的价值)。

使用HandyUIKit (通过迦太基安装)增加支持HCL,让您的生活轻松了许多

import HandyUIKit    

let color = UIColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 1.0)

// create a new UIColor object with a specific luminance (slightly lighter)
color.change(.luminance, to: 0.7)

还有应用相对变化 (推荐)选项:

// create a new UIColor object with slightly darker color
color.change(.luminance, by: -0.2)

需要注意的是HandyUIKit还增加了一些其他方便的UI功能集成到你的项目-签了GitHub上的自述文件的更多细节。

我希望它能帮助!



Answer 11:

Sebyddd溶液作为扩展:

extension UIColor {    
    func darker() -> UIColor {

        var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

        if self.getRed(&r, green: &g, blue: &b, alpha: &a){
            return UIColor(red: max(r - 0.2, 0.0), green: max(g - 0.2, 0.0), blue: max(b - 0.2, 0.0), alpha: a)
        }

        return UIColor()
    }

    func lighter() -> UIColor {

        var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

        if self.getRed(&r, green: &g, blue: &b, alpha: &a){
            return UIColor(red: min(r + 0.2, 1.0), green: min(g + 0.2, 1.0), blue: min(b + 0.2, 1.0), alpha: a)
        }

        return UIColor()
    }
}

用法:

let darkerYellow = UIColor.yellow.darker()
let lighterYellow = UIColor.yellow.lighter()


Answer 12:

我不知道,如果你正在寻找某种Objective-C的答案,但基于由RGBA工作中指定的颜色如何,我想你可以简单地按比例根据任意因素的RGB值获得一个“轻”或“暗”的阴影。 例如,你可能有一个蓝色:

[UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:1.0];

想要一个深蓝色? 0.9乘RGB值:

[UIColor colorWithRed:0.0 green:0.0 blue:0.9 alpha:1.0];

瞧。 或者,也许你有一个橙色:

[UIColor colorWithRed:1.0 green:0.4 blue:0.0 alpha:1.0];

另一种选择比例因子,说,0.8:

[UIColor colorWithRed:0.8 green:0.32 blue:0.0 alpha:1.0];

这就是你要找的那种效果?



Answer 13:

与夫特4.x的测试在Xcode 10为iOS 12

先从你的颜色作为的UIColor,并选择一个变暗的因素(作为CGFloat的)

let baseColor = UIColor.red
let darkenFactor: CGFloat = 2

类型CGColor有一个可选的值components ,其分解颜色分为RGBA(作为CGFloat的数组值0和1之间)。 然后,您可以使用从CGColor采取RGBA值重建的UIColor和操纵它们。

let darkenedBase = UIColor(displayP3Red: startColor.cgColor.components![0] / darkenFactor, green: startColor.cgColor.components![1] / darkenFactor, blue: startColor.cgColor.components![2] / darkenFactor, alpha: 1)

在这个例子中,每个RGB valuse被除以2,使彩色半暗,因为它是前。 阿尔法值保持不变,但你可以交替应用变暗因素的阿尔法值,而不是RGB。



Answer 14:

理想地,该函数应一个内部被封装UIColor扩展调用, UIColor+Brightness.swift ,和具有可配置的亮度-见下文实施例:

import UIKit

extension UIColor {

  func lighterColorWithBrightnessFactor(brightnessFactor:CGFloat) -> UIColor {
    var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0
    if self.getRed(&r, green:&g, blue:&b, alpha:&a) {
      return UIColor(red:min(r + brightnessFactor, 1.0),
        green:min(g + brightnessFactor, 1.0),
        blue:min(b + brightnessFactor, 1.0),
        alpha:a)
    }
    return UIColor()
  }

}


Answer 15:

我渲染基于状态值,色细胞:

为此,我写了一个迅速扩展基于一些旧的objc代码,我使用CryingHippo的建议错误后:

extension UIColor{

    func darker(darker: CGFloat) -> UIColor{

        var red: CGFloat = 0.0
        var green: CGFloat = 0.0
        var blue: CGFloat = 0.0

        if self.colorSpace == UIColorSpace.genericGrayColorSpace(){

            red =  whiteComponent - darker
            green = whiteComponent - darker
            blue  = whiteComponent - darker
        } else {
            red = redComponent - darker
            green = greenComponent - darker
            blue = blueComponent - darker
        }

        if red < 0{
            green += red/2
            blue += red/2
        }

        if green < 0{
            red += green/2
            blue += green/2
        }

        if blue < 0{
            green += blue/2
            red += blue/2
        }

        return UIColor(
            calibratedRed: red,
            green: green,
            blue: blue,
            alpha: alphaComponent
        )
    }

    func lighter(lighter: CGFloat) -> UIColor{
        return darker(-lighter)
    }
}

出于同样的作品NSColor为好。 只需更换UIColorNSColor



Answer 16:

这里是一个的UIColor类还允许在颜色的变化量的控制。

- (UIColor *)lighterColorWithDelta:(CGFloat)delta
{
    CGFloat r, g, b, a;
    if ([self getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MIN(r + delta, 1.0)
                               green:MIN(g + delta, 1.0)
                                blue:MIN(b + delta, 1.0)
                               alpha:a];
    return nil;
}

- (UIColor *)darkerColorWithDelta:(CGFloat)delta
{
    CGFloat r, g, b, a;
    if ([self getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MAX(r - delta, 0.0)
                               green:MAX(g - delta, 0.0)
                                blue:MAX(b - delta, 0.0)
                               alpha:a];
    return nil;
}


Answer 17:

基于@Sebyddd答案迅速扩展:

import Foundation
import UIKit

extension UIColor{
    func colorWith(brightness: CGFloat) -> UIColor{
        var r:CGFloat = 0, g:CGFloat = 0, b:CGFloat = 0, a:CGFloat = 0

        if getRed(&r, green: &g, blue: &b, alpha: &a){
            return UIColor(red: max(r + brightness, 0.0), green: max(g + brightness, 0.0), blue: max(b + brightness, 0.0), alpha: a)
        }

        return UIColor()
    }
}


文章来源: Get Slightly Lighter and Darker Color from UIColor