[objective-c] UIColor에서 약간 더 밝고 어두운 색상 얻기

UIColor를 그라디언트로 바꿀 수 있기를 원했습니다. 내가하려고하는 방식은 Core Graphics를 사용하여 그라디언트를 그리는 것입니다. 내가하려고하는 것은 색상을 얻는 것입니다.

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

그리고 몇 가지 색조가 더 어둡고 몇 가지 색조가 더 밝은 UIColor를 얻습니다. 누구든지 이것을하는 방법을 알고 있습니까? 감사합니다.



답변

- (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 범주로 구현해야합니다. 또한 @Riley의 아이디어에서 상수 값을 더하거나 빼는 대신 색상을 비례 적으로 더 어둡거나 밝게 만드는 것이 좋습니다. @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


답변

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

목표 -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 스케일의 가장자리에 더 가깝게 색상을 가져옵니다. 기본적으로 검은 색으로 시작하고 순수한 색상으로 끝납니다 …

기본적으로 밝기 (값)는 색상을 검은 색에 가깝게 또는 더 가깝게 만들고 채도는 흰색에 가깝거나 더 가깝게 만듭니다 …

여기에서 볼 수 있듯이 :

HSV 컬러 그래프

따라서 실제로 색상을 더 밝게 (즉, 흰색에 더 가깝게) 만드는 솔루션 은 채도 값을 더 작게 만들어이 솔루션 을 만듭니다 .

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


답변

getHue를 사용하여 iOS 및 OS X 용 Swift 범용 확장 :

#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

    }

}

사용법 :

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 (기본값) :

color.lighter()
color.darker()

샘플 :

여기에 이미지 설명을 입력하십시오


답변

RGB와 동일한 결과를 원했습니다.

  • 흰색 배경 위에 알파 x %로 색상을 배치하여 밝게
  • 검정색 배경 위에 알파 x %로 색상을 배치하여 어둡게

그래디언트 크기의 x %에서 ‘컬러 투 화이트’또는 ‘컬러 투 블랙’그라디언트에서 색상을 선택하는 것과 동일한 결과 인 AFAIK를 제공합니다.

이를 위해 수학은 간단합니다.

extension UIColor {
    func mix(with color: UIColor, amount: CGFloat) -> UIColor {
        var red1: CGFloat = 0
        var green1: CGFloat = 0
        var blue1: CGFloat = 0
        var alpha1: CGFloat = 0

        var red2: CGFloat = 0
        var green2: CGFloat = 0
        var blue2: CGFloat = 0
        var alpha2: CGFloat = 0

        getRed(&red1, green: &green1, blue: &blue1, alpha: &alpha1)
        color.getRed(&red2, green: &green2, blue: &blue2, alpha: &alpha2)

        return UIColor(
            red: red1 * (1.0 - amount) + red2 * amount,
            green: green1 * (1.0 - amount) + green2 * amount,
            blue: blue1 * (1.0 - amount) + blue2 * amount,
            alpha: alpha1
        )
    }
}

다음은 일부 색상의 예입니다

더 어둡고 밝은 예


답변

스위프트에서의 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()
}


답변

RGB 색상을 HSL 색상 모델 로 변환하면 L = 밝기 구성 요소를 L = 0.0 (검정)에서 L = 0.5 (자연 색상) 이상 L = 1.0 (흰색)으로 변경할 수 있습니다. UIColorHSL을 직접 처리 할 수 ​​없지만 RGB <-> HSL을 변환하는 공식이 있습니다.


답변

솔루션의 아무도는 게시 된 아주 모든 색상과 음영을 위해 일하지,하지만 난 운 좋게 발견 한 이 라이브러리 UIColor에 아주 잘 구현 확장 세트를 제공합니다.

특히 HSL 구현의 일부로 밝게 기능합니다 (UIColor *)lighten:(CGFloat)amount.-완벽하게 작동합니다.