UIColor が暗いか明るいかを確認しますか?
質問
選択した UIColor (ユーザーが選択した) が暗いか明るいかを判断する必要があるため、読みやすくするためにその色の上にあるテキスト行の色を変更できます。
Flash/Actionscript の例を次に示します (デモ付き)。http://web.archive.org/web/20100102024448/http://theflashblog.com/?p=173
何かご意見は?
乾杯、アンドレ
アップデート
皆さんの提案のおかげで、実際に動作するコードは次のとおりです。
- (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 /#カラーコントラストの
あなただけの上に色の明るさの計算を使用し、黒または白のテキストをやっている場合。それが125未満の場合、白のテキストを使用します。それは125以上である場合には、黒のテキストを使用します。
編集1:黒のテキストへのバイアス。 :)
編集2:使用する式は((レッド値* 299)+(グリーン値* 587)+(ブルー値* 114))/ 1000
。他のヒント
ここでは、このチェックを実行するスイフト(3)拡張である。
この拡張機能は、グレースケールの色で動作します。ただし、初期化子RGBですべての色を作成して、そのようなUIColor.black
やUIColor.white
ような色で構築を使用していない場合は、おそらくあなたは、追加のチェックを削除することができます。
extension UIColor {
// Check if the color is light or dark, as defined by the injected lightness threshold.
// Some people report that 0.7 is best. I suggest to find out for yourself.
// A nil value is returned if the lightness couldn't be determined.
func isLight(threshold: Float = 0.5) -> Bool? {
let originalCGColor = self.cgColor
// Now we need to convert it to the RGB colorspace. UIColor.white / UIColor.black are greyscale and not RGB.
// If you don't do this then you will crash when accessing components index 2 below when evaluating greyscale colors.
let RGBCGColor = originalCGColor.converted(to: CGColorSpaceCreateDeviceRGB(), intent: .defaultIntent, options: nil)
guard let components = RGBCGColor?.components else {
return nil
}
guard components.count >= 3 else {
return nil
}
let brightness = Float(((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000)
return (brightness > threshold)
}
}
をテストします:
func testItWorks() {
XCTAssertTrue(UIColor.yellow.isLight()!, "Yellow is LIGHT")
XCTAssertFalse(UIColor.black.isLight()!, "Black is DARK")
XCTAssertTrue(UIColor.white.isLight()!, "White is LIGHT")
XCTAssertFalse(UIColor.red.isLight()!, "Red is DARK")
}
注:スウィフト3 12/7/18
のに更新しましたエリック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];
}
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
}
カテゴリでのこの問題に対する私のソリューションは、(ここでは他の回答から引き出されます)。また、他の回答のどれを書いていない時に行うグレースケールの色、で動作します。
@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
スウィフト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)
}
}
シンプルスウィフト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
}
}
あなたがブロックバージョンを好む場合:
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;
};
は灰色がかったではありませんすべてのため、色のRGB逆は通常、非常にそれとは対照的です。 デモは、単に色を反転し(グレーに変換し、それを)不飽和化
しかし、色の素敵な癒しの組み合わせを生成することは非常に複雑です。 見てみます:
http://particletree.com/notebook/calculating-カラーコントラストのため、読みやすいテキスト/ の
は、以下の方法は、検索色が白色でに基づいてスイフト言語で明暗である。
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
}
は、以下の方法を見つけるの色が色成分を用いて、スイフトに明暗である。
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
}
私は唯一CGColorGetComponentsを使用してのために働いていなかった、私は白のようなUIColorsのための2つのコンポーネントを取得します。だから私は、最初の色spaceModelを確認する必要があります。 これは、私は@ mattsvenの回答の迅速なバージョンになってしまっ思い付いたものです。
ここから取られた色空間: https://stackoverflow.com/a/16981916/4905076 の
extension UIColor {
func isLight() -> Bool {
if let colorSpace = self.cgColor.colorSpace {
if colorSpace.model == .rgb {
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)
}
else {
var white : CGFloat = 0.0
self.getWhite(&white, alpha: nil)
return white >= 0.5
}
}
return false
}
UIColorの HSB色空間のに変換するには、以下の方法があります:
- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha;
あなたは色の明るさを見つけたい場合は、ここでいくつかの擬似コードがあります:
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);
}