kee*_*n3d 8 cocoa-touch objective-c uicolor
昨天我遇到了一个需要照亮UIColor的情况,所以我创建了一个类别并添加了一个lighten方法.我认为直接将颜色乘以颜色的每个组成部分,但我的果岭开始变黄,所以我知道它必须更复杂.
我想出的解决方案是从sRGB转换为线性,乘以颜色,然后转换回来.这似乎有效,但我不确定它是否"正确".我在文档中找不到任何说明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]];
}
Run Code Online (Sandbox Code Playgroud)
And*_*sky 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;
}
Run Code Online (Sandbox Code Playgroud)
它被调用如下:
[self changeBrightness:someUiColor amount:1.1]
Run Code Online (Sandbox Code Playgroud)
使用1.1它会使亮度增加10%; 0.9会使亮度降低10%.请注意,10%是相对于纯白色的(即,10%总是亮度增加.1)如果您希望百分比增加一致地使颜色变亮或变暗,无论其初始亮度如何,这都是预期的行为.
您可以使用色调、饱和度和亮度。
使用获取旧值
- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha
Run Code Online (Sandbox Code Playgroud)
然后调整亮度,构造一个新的颜色:
- (UIColor *)initWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha
Run Code Online (Sandbox Code Playgroud)
请记住,您需要将指针传递给第一个函数。