检查UIColor是否黑暗或明亮?

我需要确定选定的UIColor(用户选取的)是黑暗的还是明亮的,所以我可以改变位于该颜色之上的一行文本的颜色,以获得更好的可读性。

下面是Flash / Actionscript(带有演示)的示例: http : //theflashblog.com/?p=173

有什么想法吗?

干杯,安德烈

UPDATE

感谢大家的build议,以下是工作代码:

- (void) updateColor:(UIColor *) newColor { const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor); CGFloat colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000; if (colorBrightness < 0.5) { NSLog(@"my color is dark"); } else { NSLog(@"my color is light"); } } 

再次感谢 :)

W3C有以下内容: http : //www.w3.org/WAI/ER/WD-AERT/#color-contrast

如果您只做黑白文本,请使用上面的颜色亮度计算。 如果它低于125,请使用白色文本。 如果是125或以上,请使用黑色文本。

编辑1:偏向黑色文字。 🙂

编辑2:使用的公式是((红色值* 299)+(绿色值* 587)+(蓝色值* 114))/ 1000。

使用Erik Nedwidek的回答,我想出了一小段代码,以便于包容。

 - (UIColor *)readableForegroundColorForBackgroundColor:(UIColor*)backgroundColor { size_t count = CGColorGetNumberOfComponents(backgroundColor.CGColor); const CGFloat *componentColors = CGColorGetComponents(backgroundColor.CGColor); CGFloat darknessScore = 0; if (count == 2) { darknessScore = (((componentColors[0]*255) * 299) + ((componentColors[0]*255) * 587) + ((componentColors[0]*255) * 114)) / 1000; } else if (count == 4) { darknessScore = (((componentColors[0]*255) * 299) + ((componentColors[1]*255) * 587) + ((componentColors[2]*255) * 114)) / 1000; } if (darknessScore >= 125) { return [UIColor blackColor]; } return [UIColor whiteColor]; } 

这是一个Swift扩展:

 extension UIColor { func isLight() -> Bool { let components = CGColorGetComponents(self.CGColor) let brightness = ((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000 if brightness < 0.5 { return false } else { return true } } } 

Swift3

 extension UIColor { var isLight: Bool { var white: CGFloat = 0 getWhite(&white, alpha: nil) return white > 0.5 } } // Usage if color.isLight { label.textColor = UIColor.black } else { label.textColor = UIColor.white } 

我在这个问题的解决scheme(从这里的其他答案)。 也适用于灰色的颜色,在撰写本文时没有其他答案。

 @interface UIColor (Ext) - (BOOL) colorIsLight; @end @implementation UIColor (Ext) - (BOOL) colorIsLight { CGFloat colorBrightness = 0; CGColorSpaceRef colorSpace = CGColorGetColorSpace(self.CGColor); CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace); if(colorSpaceModel == kCGColorSpaceModelRGB){ const CGFloat *componentColors = CGColorGetComponents(self.CGColor); colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000; } else { [self getWhite:&colorBrightness alpha:0]; } return (colorBrightness >= .5f); } @end 

如果你喜欢的版块:

 BOOL (^isDark)(UIColor *) = ^(UIColor *color){ const CGFloat *component = CGColorGetComponents(color.CGColor); CGFloat brightness = ((component[0] * 299) + (component[1] * 587) + (component[2] * 114)) / 1000; if (brightness < 0.75) return YES; return NO; }; 

更简单的Swift 3扩展:

 extension UIColor { func isLight() -> Bool { guard let components = cgColor.components else { return false } let redBrightness = components[0] * 299 let greenBrightness = components[1] * 587 let blueBrightness = components[2] * 114 let brightness = (redBrightness + greenBrightness + blueBrightness) / 1000 return brightness > 0.5 } } 

对于一切不是灰色的,颜色的RGB反转通常与其高度相反。 该演示只是反转颜色和饱和度(将其转换为灰色)。

但是产生一个很好的舒缓颜色组合是相当复杂的。 看着 :

http://particletree.com/notebook/calculating-color-contrast-for-legible-text/

以下方法是基于白色在Swift语言中查找颜色是否明亮或黑暗。

 func isLightColor(color: UIColor) -> Bool { var white: CGFloat = 0.0 color.getWhite(&white, alpha: nil) var isLight = false if white >= 0.5 { isLight = true NSLog("color is light: %f", white) } else { NSLog("Color is dark: %f", white) } return isLight } 

以下方法是使用颜色组件在Swift中查找颜色是否明亮或黑暗。

 func isLightColor(color: UIColor) -> Bool { var isLight = false var componentColors = CGColorGetComponents(color.CGColor) var colorBrightness: CGFloat = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000; if (colorBrightness >= 0.5) { isLight = true NSLog("my color is light") } else { NSLog("my color is dark") } return isLight } 

如果你想find颜色的亮度,这里是一些伪代码:

 public float GetBrightness(int red, int blue, int green) { float num = red / 255f; float num2 = blue / 255f; float num3 = green / 255f; float num4 = num; float num5 = num; if (num2 > num4) num4 = num2; if (num3 > num4) num4 = num3; if (num2 < num5) num5 = num2; if (num3 < num5) num5 = num3; return ((num4 + num5) / 2f); } 

如果它> 0.5,则是明亮的,否则是黑暗的。

 - (BOOL)isColorLight:(UIColor*)color { CGFloat white = 0; [color getWhite:&white alpha:nil]; return (white >= .5); } 

使用HandyUIKit使得这是一个不费吹灰之力 ,例如:

 import HandyUIKit UIColor.black.hlca.luminance // => 0.0 UIColor.white.hlca.luminance // => 1.0 UIColor.lightGray.hlca.luminance // => 0.70 UIColor.darkGray.hlca.luminance // => 0.36 UIColor.red.hlca.luminance // => 0.53 UIColor.green.hlca.luminance // => 0.87 UIColor.blue.hlca.luminance // => 0.32 

只要在任何UIColor实例上使用.hlca.luminance ,就会为您提供正确的感知亮度值 。 大多数其他方法并没有考虑到人类 在不同亮度水平下 感知不同颜色 (即使饱和度和亮度相同)的事实。 luminance值将此考虑在内。

阅读这个伟大的博客文章或在LAB色彩空间维基百科条目进一步解释。 他们也会解释为什么HSB彩色系统brightness值只是解决scheme的一半

正如一个提示:注意, 纯绿色luminance值比纯蓝色luminance 得多。 这只是因为人类认为纯蓝色比纯绿色更深。

Swift 4版本

 extension UIColor { func isLight() -> Bool { guard let components = cgColor.components, components.count > 2 else {return false} let brightness = ((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000 return (brightness > 0.5) } }