2012-10-03 6 views
7

昨日私はUIColorを明るくする必要がある状況に遭遇したので、カテゴリを作成してlightenメソッドを追加しました。色の各要素で値を掛けるだけで簡単だと思っていましたが、緑が黄色に変わり始めたので、もっと複雑にならなければなりませんでした。UIColorを明るくする

私が思いついた解決策は、sRGBからLinearに変換し、色を掛けてから変換することでした。これはうまくいくようですが、「正しい」かどうかはわかりません。私は、UIColorがsRGB空間にあったと述べた文書で何も見つけることができませんでした。私は色彩科学者もいないので、私は関与する数学についての初歩的な知識しか持っていません。

とにかくここに私のコードがあります。私はピアレビューを求めていますし、誰かがUIColorsの変更をよりよく理解しているかどうか確認しています。

CGFloat sRGB2Linear(CGFloat x){ 
    CGFloat a = 0.055; 
    if(x <= 0.04045){ 
     return x * (1.0/12.92); 
    }else{ 
     return pow((x + a) * (1.0/(1 + a)), 2.4); 
    } 
} 

CGFloat linear2sRGB(CGFloat x){ 
    CGFloat a = 0.055; 
    if(x <= 0.0031308){ 
     return x * 12.92; 
    }else{ 
     return (1 + a) * pow(x, 1/2.4) - a; 
    } 
} 

- (UIColor *)lighten:(CGFloat)value{ 
    const CGFloat *components = CGColorGetComponents([self CGColor]); 
    CGFloat newR = (sRGB2Linear(components[0])+1)*value; 
    CGFloat newG = (sRGB2Linear(components[1])+1)*value; 
    CGFloat newB = (sRGB2Linear(components[2])+1)*value; 
    newR = MAX(0, MIN(1, linear2sRGB(newR))); 
    newG = MAX(0, MIN(1, linear2sRGB(newG))); 
    newB = MAX(0, MIN(1, linear2sRGB(newB))); 
    return [UIColor colorWithRed:newR green:newG blue:newB alpha:components[3]]; 
} 

答えて

4

色相、彩度、および明るさで作業できます。

は、明るさを調整

- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha 

を使用して古い値を取得し、新しい色を構築:

- (UIColor *)initWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha 

は、あなたが最初の関数へのポインタを渡す必要があります覚えておいてください。

+0

グレースケールの場合は機能しません。 – ozgur

24

これは(オールインワンを明るくし、暗く)簡単に相対的な明るさの変更を行うことが私のiOS5を+ソリューションです:

+ (UIColor*)changeBrightness:(UIColor*)color amount:(CGFloat)amount 
{ 

    CGFloat hue, saturation, brightness, alpha; 
    if ([color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]) { 
     brightness += (amount-1.0); 
     brightness = MAX(MIN(brightness, 1.0), 0.0); 
     return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha]; 
    } 

    CGFloat white; 
    if ([color getWhite:&white alpha:&alpha]) { 
     white += (amount-1.0); 
     white = MAX(MIN(white, 1.0), 0.0); 
     return [UIColor colorWithWhite:white alpha:alpha]; 
    } 

    return nil; 
} 

それはそうのように呼び出されています:それは増加します1.1を使用して

[self changeBrightness:someUiColor amount:1.1] 

10%明るさ。 0.9では輝度が10%低下します。 10%は純粋な白を基準にしていることに注意してください(つまり、10%は常に明るさが0.1増加します)。初期の明るさにかかわらず、一定の割合で色を明るくするか暗くするかは、

+0

優れたコード。共有してくれてありがとう。 –

0

私は彩度と色相を変更できるようにankの方法を改善しました。

入力はパーセンテージとして扱われるため、bは1.0と同じです(変更なし)。明るさを30%弱めるには、bを0.7に設定します。

+ (UIColor*)changeColor:(UIColor*)color brightness:(CGFloat)b saturation:(CGFloat)s hue:(CGFloat)h 
{ 

    CGFloat hue, saturation, brightness, alpha; 
    if ([color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]) { 
     brightness *= b; 
     brightness = MAX(MIN(brightness, 1.0), 0.0); 
     saturation *= s; 
     saturation = MAX(MIN(saturation, 1.0), 0.0); 
     hue *= h; 
     hue = MAX(MIN(hue, 1.0), 0.0); 
     return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha]; 
    } 

    CGFloat white; 
    if ([color getWhite:&white alpha:&alpha]) { 
     white += (b-1.0); 
     white = MAX(MIN(b, 1.0), 0.0); 
     return [UIColor colorWithWhite:white alpha:alpha]; 
    } 

    return nil; 
} 
0

は、それはあなたが0.2にアルファを設定することができますし、私はそれはスウィフトで

0

Kofのの答えOKになると思い、あなたの色

と混合して白色を返す必要があります

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

を試してみてください:

extension UIColor { 
    public func changeBrightness(b: CGFloat, saturation s: CGFloat = 1.0, hue h: CGFloat = 1.0) -> UIColor? { 
     var hue : CGFloat = 0.0 
     var saturation : CGFloat = 0.0 
     var brightness : CGFloat = 0.0 
     var alpha : CGFloat = 0.0 

     if self.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &alpha) { 
      brightness *= b 
      brightness = max(min(brightness, 1.0), 0.0) 
      saturation *= s 
      saturation = max(min(saturation, 1.0), 0.0) 
      hue *= h 
      hue = max(min(hue, 1.0), 0.0) 

      return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: alpha) 
     } 

     var white: CGFloat = 0.0 
     if self.getWhite(&white, alpha: &alpha) { 
      white += (b - 1.0) 
      white = max(min(b, 1.0), 0.0) 

      return UIColor(white: white, alpha: alpha) 
     } 

     return nil 
    } 
} 
0
- (UIColor *)changeBrightnessToPercentage:(CGFloat)percentage { 
    CGFloat hue, saturation, brightness, alpha; 
    if ([self getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]) { 
     brightness += (percentage - 1.0); 
     brightness = MAX(MIN(brightness, 1.0), 0.0); 
     return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha]; 
    } 

    CGFloat white; 
    if ([self getWhite:&white alpha:&alpha]) { 
     white += (percentage - 1.0); 
     white = MAX(MIN(white, 1.0), 0.0); 
     return [UIColor colorWithWhite:white alpha:alpha]; 
    } 

    return nil; 
} 

== 1.0は指定された色です。> 1.0はより明るい色で、< 1.0は暗い色です。

関連する問題