Ios 使颜色变浅
昨天我遇到了一个情况,我需要使UIColor变亮,所以我创建了一个类别,并添加了一个Ios 使颜色变浅,ios,objective-c,swift,cocoa-touch,uicolor,Ios,Objective C,Swift,Cocoa Touch,Uicolor,昨天我遇到了一个情况,我需要使UIColor变亮,所以我创建了一个类别,并添加了一个lighte方法。我原以为直接将值乘以颜色的每个组成部分会很简单,但我的绿色开始变黄,所以我知道它必须更复杂 我提出的解决方案是将sRGB转换为线性,将颜色相乘,然后再转换回来。这似乎有效,但我不确定它是否“正确”。我在文档中找不到任何声明UIColor在sRGB空间中的内容。我也不是一个色彩科学家,所以我只有一个基本的数学知识 不管怎样,这是我的代码,我要求一些同行评审,看看是否有人对修改UIColor有更好的
lighte
方法。我原以为直接将值乘以颜色的每个组成部分会很简单,但我的绿色开始变黄,所以我知道它必须更复杂
我提出的解决方案是将sRGB转换为线性,将颜色相乘,然后再转换回来。这似乎有效,但我不确定它是否“正确”。我在文档中找不到任何声明UIColor在sRGB空间中的内容。我也不是一个色彩科学家,所以我只有一个基本的数学知识
不管怎样,这是我的代码,我要求一些同行评审,看看是否有人对修改UIColor有更好的理解
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]];
}
CGFloat sRGB2Linear(CGFloat x){
CGA=0.055;
如果(x,则可以使用色调、饱和度和亮度
使用
- (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
请记住,您需要向第一个函数传递指针。这是我的iOS5+解决方案,可以轻松更改相对亮度(一体式变亮和变暗):
它是这样调用的:
[self changeBrightness:someUiColor amount:1.1]
使用1.1将使亮度增加10%;0.9将使亮度减少10%。请注意,10%是相对于纯白色的(即,10%始终是亮度增加0.1%)如果您希望增加百分比,使颜色始终变亮或变暗,而不管其初始亮度如何,这是预期的行为。我改进了ank的方法,允许修改饱和度和色调
输入按百分比处理,因此1.0的b
等于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;
}
试一试
它应该返回与您的颜色混合的白色
因此,您可以将alpha设置为0.2,我认为这是可以的
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
}
}
==1.0是提供的颜色,>1.0是较浅的颜色,与白色混合是我发现的唯一不会扭曲原始颜色的方法,就像在这个快速扩展中:
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)
}
}
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
}
}
- (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;
}
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)
}
}