首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >点亮UIColor

点亮UIColor
EN

Stack Overflow用户
提问于 2012-10-04 03:52:45
回答 7查看 4K关注 0票数 8

我昨天遇到了一种情况,我需要减轻一个类别,所以我创建了一个UIColor并添加了一个lighten方法。我认为直接将值乘以颜色的每个分量就可以了,但我的绿色开始变黄,所以我知道它必须更复杂。

我想出的解决方案是从sRGB转换为线性,乘以颜色,然后再转换回来。这似乎是有效的,但我不确定它是否“正确”。我在文档中找不到任何说明UIColor在sRGB空间中的东西。我也不是色彩科学家,所以我只有基本的数学知识。

不管怎样,这是我的代码,我要求进行一些同行评审,看看是否有人对修改UIColors有更好的理解。

代码语言:javascript
复制
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]];
}
EN

回答 7

Stack Overflow用户

发布于 2013-01-26 15:24:16

这是我的iOS5+解决方案,可以轻松改变相对亮度(变亮和变暗一体机):

代码语言:javascript
复制
+ (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;
}

它是这样调用的:

代码语言:javascript
复制
[self changeBrightness:someUiColor amount:1.1]

使用1.1将使亮度增加10%;0.9将使亮度降低10%。请注意,10%是相对于纯白色的(即,10%始终是亮度的.1增加)。如果您希望增加百分比以一致地使颜色变亮或变暗,而不考虑颜色的初始亮度,则这是预期的行为。

票数 24
EN

Stack Overflow用户

发布于 2012-10-04 04:20:01

您可以使用色调、饱和度和亮度。

使用以下命令获取旧值

代码语言:javascript
复制
- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha

然后调整亮度,构造一个新的颜色:

代码语言:javascript
复制
- (UIColor *)initWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha

请记住,您需要传递指向第一个函数的指针。

票数 4
EN

Stack Overflow用户

发布于 2016-01-03 08:37:44

Kof在Swift中的回答是:

代码语言:javascript
复制
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
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12715810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档