8

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

私が思いついた解決策は、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

7 に答える 7

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

次のように呼び出されます。

[self changeBrightness:someUiColor amount:1.1]

1.1 を使用すると、明るさが 10% 増加します。0.9 では明るさが 10% 減少します。10% は純粋な白に対する相対値であることに注意してください (つまり、10% は常に 0.1 の明るさの増加です)。これは、初期の明るさに関係なく一貫して色を明るくしたり暗くしたりするパーセンテージの増加が必要な場合に想定される動作です。

于 2013-01-26T07:24:16.467 に答える
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

最初の関数にポインターを渡す必要があることに注意してください。

于 2012-10-03T20:20:01.047 に答える
1

この Swift 拡張機能のように、元の色を歪めない唯一の方法は、白と混合することです。

extension UIColor {

    @objc func lighten(_ alpha: CGFloat) -> UIColor {
        var r: CGFloat = 0
        var g: CGFloat = 0
        var b: CGFloat = 0
        var a: CGFloat = 0
        guard self.getRed(&r, green: &g, blue: &b, alpha: &a) else { return self }
        return UIColor(red:r + (1.0-r) * alpha, green:g + (1.0-g) * alpha, blue:b + (1.0-b) * alpha, alpha: a)
    }
}
于 2020-02-04T16:03:49.830 に答える
1

試す

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

それはあなたの色と混合した白色を返すはずです

alpha を 0.2 に設定すれば問題ないと思います

于 2015-06-16T11:09:27.440 に答える
0

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

入力はパーセンテージとして扱われるためb、1.0 は 100% (変化なし) に相当します。明るさを 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;
}
于 2014-06-27T12:48:12.260 に答える
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 は暗い色です。

于 2016-03-24T15:24:18.837 に答える