Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 检查颜色是暗的还是亮的?_Ios_Iphone_Xcode_Colors_Uicolor - Fatal编程技术网

Ios 检查颜色是暗的还是亮的?

Ios 检查颜色是暗的还是亮的?,ios,iphone,xcode,colors,uicolor,Ios,Iphone,Xcode,Colors,Uicolor,我需要确定所选UIColor(由用户选择)是暗的还是亮的,因此我可以更改位于该颜色上方的一行文本的颜色,以提高可读性 下面是Flash/Actionscript中的一个示例(带演示): 有什么想法吗 干杯, 安德烈 更新 感谢大家的建议,以下是工作代码: - (void) updateColor:(UIColor *) newColor { const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor);

我需要确定所选UIColor(由用户选择)是暗的还是亮的,因此我可以更改位于该颜色上方的一行文本的颜色,以提高可读性

下面是Flash/Actionscript中的一个示例(带演示):

有什么想法吗

干杯, 安德烈

更新

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

- (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");
    }
}
-(void)updateColor:(UIColor*)newColor
{
常量CGFloat*componentColors=CGColorGetComponents(newColor.CGColor);
CGFloat colorBrightness=((componentColors[0]*299)+(componentColors[1]*587)+(componentColors[2]*114))/1000;
如果(颜色亮度<0.5)
{
NSLog(@“我的颜色是深色”);
}
其他的
{
NSLog(“我的颜色是浅的”);
}
}

再次感谢:)

对于所有不是灰色的东西,颜色的RGB反转通常与它形成强烈对比。 演示只是反转颜色并使其去饱和(将其转换为灰色)

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


如果您想找到颜色的亮度,下面是一些伪代码:

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);
}
public float GetBrightness(整数红色、整数蓝色、整数绿色)
{
浮点数=红色/255f;
浮动num2=蓝色/255f;
浮点数=绿色/255f;
浮点num4=num;
float num5=num;
如果(num2>num4)
num4=num2;
如果(num3>num4)
num4=num3;
如果(num2
如果大于0.5,则为亮,否则为暗。

W3C具有以下特性:

如果您只处理黑色或白色文本,请使用上面的颜色亮度计算。如果低于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 5
版本:

var white: CGFloat = 0.0
color.getWhite(&white, alpha: nil)
return white >= .85 // Don't use white background

如果您更喜欢块版本:

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;
};
BOOL(^isDark)(UIColor*)=^(UIColor*color){
const CGFloat*component=CGColorGetComponents(color.CGColor);
CGFloat亮度=((组件[0]*299)+(组件[1]*587)+(组件[2]*114))/1000;
如果(亮度<0.75)
返回YES;
返回否;
};
这里有一个Swift(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")
}

注意:更新至Swift 3 12/7/18我对该问题的分类解决方案(来自此处的其他答案)。也适用于灰度颜色,在撰写本文时,其他答案都不适用

@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

下面的方法是根据颜色中的白色,在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
}
迅捷3
更简单的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
    }
}
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)
    }
}

对于我来说,只使用CGColorGetComponents不起作用,我得到了两个UIColors的组件,比如白色。所以我必须先检查颜色空间模型。 这就是我想到的,最终成为@mattsven答案的快速版本

从这里获取的颜色空间:


UIColor使用以下方法转换为HSB颜色空间:

- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha;


你不能对每种颜色都平均加权。我们的眼睛对蓝色有偏见,对红色的偏见较小。@ErikNedwidek:很公平,问题只是问颜色的亮度:)如果有iPhone版本的话:DSo如果我得到一种颜色的RGB值(我不知道怎么做),并创建一种与这些值相反的新颜色,这应该在一个非常基本的级别上工作?你知道如何获得颜色的红、绿和蓝值吗?你可以使用
NSArray*组件=(NSArray*)CGColorGetComponents([UIColor CGColor])以获取颜色组件的数组,包括alpha。文档没有指定它们的顺序,但我假设它们是红色、绿色、蓝色和阿尔法色。另外,在文档中,“数组的大小比颜色的颜色空间的组件数量多一个。”-它没有说明原因…这很奇怪…使用:NSArray*components=(NSArray*)CGColorGetComponents(newColor.CGColor);NSLog(@“我的颜色组件%f%f%f%f”、组件[0]、组件[1]、组件[2]、组件[3]);只是为了看看我是否能得到这些值,似乎只有0索引发生了变化,其他索引将保持不变,不管我选择什么颜色。知道为什么吗?明白了。你不能用NSArray。改为使用:const CGFloat*components=CGColorGetComponents(newColor.CGColor);此外,顺序为:红色为组件[0];绿色是组件[1];蓝色是组件[2];α是组分[3];啊,我的错。我认为它返回的是CFArrayRef,而不是C数组。很抱歉我使用了这段代码,工作得很好,但不知道何时设置[UIColor blackColor],它返回的是darknessScore=149.685。你能解释一下为什么会发生这种情况吗?这段代码不适用于非RGB颜色,例如
UIColor whiteColor、grayColor、blackColor
@rmaddy为什么?或者为什么不是白色、灰色和黑色RGB颜色?@rmaddy如何通过编程区分RGB颜色空间中的颜色与灰度之间的差异?@maddy Nevermind!感谢您的帮助-这仅在
UIColor
为灰度颜色时有效。随机RGB颜色不适用于此代码。对非RGB颜色的处理很好-效果很好。效果很好。使用Swift 2.0时,我在亮度计算时遇到了一个编译器错误:“表达式太复杂,无法求解
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)
    }
}
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
    }
- (BOOL)getHue:(CGFloat *)hue saturation:(CGFloat *)saturation brightness:(CGFloat *)brightness alpha:(CGFloat *)alpha;