获取颜色的深浅这个需求并不少见,比如根据背景色来动态更改Label的文字颜色以让用户获得更好的阅读体验。
下面介绍一个简单的判断方法,可能不是最好的,但可以满足大部分需求。
颜色深很好理解,颜色浅就稍复杂一点,简单归为两种情况:
1.透明
2.不透明
不透明好办,不多做叙述。
对于透明,我自己在测试中发现可氛围两种情况来处理,一是全透明,二是部分透明。
我们看一下CGColor的一个方法:
1 2
| / Return the color components (including alpha) associated with `color’. / CG_EXTERN const CGFloat *CGColorGetComponents(CGColorRef color)
|
这个方法可以取得颜色的分力,我们将用它来做颜色深浅的判断。上面的说明写的很清楚,包括透明度。但实际测试上,这个方法会把全透明判断为深色,所以对全透明我们做一个特别处理。
获取透明度代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| - (CGFloat) alphaForColor:(UIColor*)color { CGFloat r, g, b, a, w, h, s, l; BOOL compatible = [color getWhite:&w alpha:&a]; if (compatible) { return a; } else { compatible = [color getRed:&r green:&g blue:&b alpha:&a]; if (compatible) { return a; } else { [color getHue:&h saturation:&s brightness:&l alpha:&a]; return a; } } }
|
判断颜色深浅代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| -(BOOL)isDarkColor:(UIColor )newColor{ if ([self alphaForColor: newColor]<10e-5) { return YES; } const CGFloat componentColors = CGColorGetComponents(newColor.CGColor); CGFloat colorBrightness = ((componentColors[0] 299) + (componentColors[1] 587) + (componentColors[2] * 114)) / 1000; if (colorBrightness < 0.5){ NSLog(@"Color is dark"); return YES; } else{ NSLog(@"Color is light"); return NO; } }
|
下一篇博文,我将对本篇做一点扩展,介绍获取图片颜色均值的方法。