问题 为什么[UIColor whiteColor]和blackColor的亮度相等


让我向您展示一些获得三个UIColors的色调,饱和度和亮度的结果。

[[UIColor redColor] getHue:&hue
                saturation:&saturation
                 brightness:&brightness
                 alpha:&alpha];

hue = 1.0 saturatino = 1.0 brightness = 1.0 alpha = 0.0

[[UIColor whiteColor] getHue:&hue
                  saturation:&saturation
                  brightness:&brightness
                       alpha:&alpha];

hue = 0.0 saturatino = 0.0 brightness = 0.0 alpha = 0.0

[[UIColor blackColor] getHue:&hue
                  saturation:&saturation
                  brightness:&brightness
                       alpha:&alpha];

hue = 0.0 saturatino = 0.0 brightness = 0.0 alpha = 0.0

任何人都可以解释为什么色调,饱和度,白色和黑色的亮度相等?为什么alpha等于零?

我想在我的项目中做的是通过改变它的亮度从给定的颜色生成“更暗”的颜色:

亮度=亮度* 0.8;

它适用于任何颜色,但它从白色产生黑色。 (虽然我希望有一种灰色)。


10431
2018-02-28 08:37


起源

+1很棒的捕获,从未尝试过这个。 - Forgot
saturatino 听起来cuterino :) - Christian Schnorr


答案:


原因是因为 +whiteColor 和 +blackColor 两者都返回灰度颜色空间中的颜色,这与HSB颜色空间不兼容。因此, -getHue:saturation:brightness:alpha: 实际上并没有修改参数。我想你会发现你已经准备好了 0.0 在调用该方法之前。如果你检查的返回值 -getHue:saturation:brightness:alpha: 它会告诉你它是否成功转换为HSB。


12
2018-02-28 08:42



+1惊人!!!没想过这个。 - Forgot
谢谢!那么有没有通用的方法从UIColor生成更暗的颜色,即使它是灰度的? getHue时是否还有其他情况:饱和度:亮度:alpha:可能返回false? - msmialko
@Moriquendi:其他颜色空间可能无法转换为HSB,但我不知道你可能会在iOS编程中遇到多少个颜色空间。最糟糕的情况是,您可以创建一个由您自己的数据支持的1px-by-1px CGBitmapContext,用源颜色填充它,再用大部分透明的黑色填充它,删除上下文,并读取您的像素缓冲区以获得新颜色。 - Kevin Ballard


凯文巴拉德上面给出了关于问题原因的正确答案。我在我正在开发的应用程序中有类似的要求,除了我还想动态修改颜色的alpha。为了做到这一点,我创建了一个类别(UIColor + Modify),其中包含一个方法(参见下面的代码)。实现假设如果颜色不在RGB / HSB空间中,那么您正在寻找白色阴影。您应该可以轻松地将其调整为“倍增”亮度。

#import "UIColor+Modify.h"

@implementation UIColor (Modify)
-(UIColor*)setBrightness:(CGFloat)brightness alpha:(CGFloat)alpha {
  CGFloat hue = 0.0F;
  CGFloat saturation = 0.0F;

  [self getHue:&hue saturation:&saturation brightness:nil alpha:nil])

  // if the above fails then hue and saturation will still be 0.0F 
  // according to Apple's documentation <1>

  return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:alpha];
}
@end

当我想要改变另一种颜色的亮度和alpha时,我会使用这种方法:

#import "UIColor+Modify.h"
...
UIColor brightColor = [UIColor redColor];
UIColor lessBrightSeeThroughColor = [someColor setBrightness:0.9F alpha 0.8F];
....

<1> UIColor文档


0
2018-04-09 13:58