iOS 中使用 CSS 的 HLS 颜色

Jul 03, 2020 • 预计阅读时间 1 分钟

CSS 常用的颜色表示方式有 3 种:

  1. 十六进制数字:#123456
  2. RGB 方式:rgb(18, 52, 86)
  3. HLS 方式:hls(210, 65%, 20%)

以上 3 种方式都可以表示 #123456 这个颜色

在 UIColor 里,也有对应的方法:

a. RGB 和十六进制数字使用的方法

[UIColor colorWithRed:18/255.0 green:52/255.0 blue:86/255.0 alpha:1];

b. HSB 使用的方法

[UIColor colorWithHue:210/360.0 saturation:0.65 brightness:0.2 alpha:1];

出来的效果是这样的:

左边是 a 输出的颜色,右边是 b 输出的颜色,很明显 b 得到的颜色是不对的。

因为 b 使用的是 HSB 而不是 HSL。

  • HSB 也叫 HSV,是指:色相,饱和度,明度
  • HSL 是指:色相,饱和度,亮度

它们概念不一样,所以直接套 css 里的 hsl 参数给 UIColor 里的 hsb 得到的颜色就是错误的,都使用 RGB 是比较靠谱的方式。

另一种方法是把 HSL 转换为 HSB,UIColor 就可以处理了,添加两个分类方法:

- (instancetype)initWithHue:(CGFloat)hue saturation:(CGFloat)saturation lightness:(CGFloat)lightness alpha:(CGFloat)alpha {
    CGFloat brightness = saturation * MIN(lightness, 1 - lightness) + lightness;
    saturation = brightness ? 2 - 2 * lightness / brightness : 0;

    return [self initWithHue:hue saturation:saturation brightness:brightness alpha:alpha];
}

- (BOOL)getHue:(nullable CGFloat *)hue saturation:(nullable CGFloat *)saturation lightness:(nullable CGFloat *)lightness alpha:(nullable CGFloat *)alpha {
    CGFloat h = 0, s = 0, b = 0, a = 0;
    if (![self getHue:&h saturation:&s brightness:&b alpha:&a]) {
        return NO;
    }

    CGFloat l = b - b * s / 2;
    CGFloat m = MIN(l, 1 - l);
    s = m ? (b - l) / m : 0;

    if (hue) *hue = h;
    if (saturation) *saturation = s;
    if (lightness) *lightness = l;
    if (alpha) *alpha = a;

    return YES;
}

现在就可以直接使用 CSS 里的 HSL 参数了:

[UIColor colorWithHue:210/360.0 saturation:0.65 lightness:0.2 alpha:1];
iOS
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

越狱后使用 Xcode 调试第三方 APP

RGB、HSL 和 HSV 互相转换