rgb和hsl转换(js)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rgb和hsl转换(js)相关的知识,希望对你有一定的参考价值。

参考技术A /**

    * HSL颜色值转换为RGB.

    * 换算公式改编自 http://en.wikipedia.org/wiki/HSL_color_space.

    * h, s, 和 l 设定在 [0, 1] 之间

    * 返回的 r, g, 和 b 在 [0, 255]之间

    *

    * @param  Number  h      色相

    * @param  Number  s      饱和度

    * @param  Number  l      亮度

    * @return  Array          RGB色值数值

    */

    function hslToRgb(h, s, l)

        var r, g, b;

        if(s == 0)

            r = g = b = l; // achromatic

        else

            var hue2rgb = function hue2rgb(p, q, t)

                if(t < 0) t += 1;

                if(t > 1) t -= 1;

                if(t < 1/6) return p + (q - p) * 6 * t;

                if(t < 1/2) return q;

                if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;

                return p;

           

            var q = l < 0.5 ? l * (1 + s) : l + s - l * s;

            var p = 2 * l - q;

            r = hue2rgb(p, q, h + 1/3);

            g = hue2rgb(p, q, h);

            b = hue2rgb(p, q, h - 1/3);

       

        return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];

   

    /**

    * RGB 颜色值转换为 HSL.

    * 转换公式参考自 http://en.wikipedia.org/wiki/HSL_color_space.

        * r, g, 和 b 需要在 [0, 255] 范围内

    * 返回的 h, s, 和 l 在 [0, 1] 之间

    *

    * @param  Number  r      红色色值

    * @param  Number  g      绿色色值

    * @param  Number  b      蓝色色值

    * @return  Array          HSL各值数组

    */

    function rgbToHsl(r, g, b)

        r /= 255, g /= 255, b /= 255;

        var max = Math.max(r, g, b), min = Math.min(r, g, b);

        var h, s, l = (max + min) / 2;

        if(max == min)

            h = s = 0; // achromatic

        else

            var d = max - min;

            s = l > 0.5 ? d / (2 - max - min) : d / (max + min);

            switch(max)

                case r: h = (g - b) / d + (g < b ? 6 : 0); break;

                case g: h = (b - r) / d + 2; break;

                case b: h = (r - g) / d + 4; break;

           

            h /= 6;

       

        return [Math.floor(h*100), Math.round(s*100), Math.round(l*100)];

   

原文:https://blog.csdn.net/qq_35321405/article/details/79786977

使用 Objective C 从 RGB 转换为 HSL

【中文标题】使用 Objective C 从 RGB 转换为 HSL【英文标题】:Converting from RGB to HSL with Objective C 【发布时间】:2010-06-10 19:01:09 【问题描述】:

我对目标 c 很陌生,但已经编程了一段时间。我开始创建一个可以从 RGB 转换为 HSL 并再次转换回来的函数,但我觉得它太长并且方向错误。有谁知道执行这种转换的简单方法?

【问题讨论】:

【参考方案1】:

iPhone SDK 中缺少 NSColor。您可以使用此实用程序将 RGB 空间转换为 HSL 空间并返回:

https://github.com/alessani/ColorConverter

【讨论】:

【参考方案2】:

我想你可以使用NSColor

CGFloat r, g, b, a, h, s, b, a2;
NSColor *c = [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a];
[c getHue:&h saturation:&s brightness:&b alpha:&a2];

再想一想,我不知道NSColor 是否在iPhone 框架中可用- 不是有UIColor 吗?无论如何,我会留下这个答案,以防有人在这里搜索 OS X 解决方案。

【讨论】:

+1,虽然 HSL 与 HSB/HSV 不太一样。不过,H 和 S 应该是一样的。 @Wevah,***说它不是很标准化,并且任何名称都可以与任何模型一起使用。不过,我还不够专业,无法了解其中的微妙之处。 嗯,它们是排序的标准。几乎。不幸的是,内置的东西不能处理 HSL(ightness)。 :/ 如果他真的想要 HSV/HSB,那么你的答案就是完美的! 确实有UIColor! (我也错过了iphone 标签。) 感谢 Carl,我尝试使用 UIColor,这让我更接近了一点,但我收到错误消息“UIColor 可能无法响应 -getHue:saturation:brightness:alpha”【参考方案3】:

这是我正在使用的:

 static void RVNColorRGBtoHSL(CGFloat red, CGFloat green, CGFloat blue, CGFloat *hue, CGFloat *saturation, CGFloat *lightness)

    CGFloat r = red / 255.0f;
    CGFloat g = green / 255.0f;
    CGFloat b = blue / 255.0f;

    CGFloat max = MAX(r, g);
    max = MAX(max, b);
    CGFloat min = MIN(r, g);
    min = MIN(min, b);

    CGFloat h;
    CGFloat s;
    CGFloat l = (max + min) / 2.0f;

    if (max == min) 
        h = 0.0f;
        s = 0.0f;
    

    else 
        CGFloat d = max - min;
        s = l > 0.5f ? d / (2.0f - max - min) : d / (max + min);

        if (max == r) 
            h = (g - b) / d + (g < b ? 6.0f : 0.0f);
        

        else if (max == g) 
            h = (b - r) / d + 2.0f;
        

        else if (max == b) 
            h = (r - g) / d + 4.0f;
        

        h /= 6.0f;
    

    if (hue) 
        *hue = roundf(h * 255.0f);
    

    if (saturation) 
        *saturation = roundf(s * 255.0f);
    

    if (lightness) 
        *lightness = roundf(l * 255.0f);
    

这是如何称呼它的:

CGFloat h, s, l;
RVNColorRGBtoHSL(r, g, b,
                 &h, &s, &l);

【讨论】:

谢谢!运行速度比使用NSColor 快​​得多。 更新:这个函数实际上返回的色调值与我认为的不同。当我用它从色轮中选择不同的色调范围时,它会跳来跳去。相比之下,以下解决方案如我所料围绕色轮旋转:***.com/a/6930407/1976584【参考方案4】:

您可以将 UIColor-HSVAdditions.h/.m 类别添加到您的应用中,以向 UIColor 添加一组操作以处理色调、饱和度和值。请参阅http://bravobug.com/news/?p=448 和 这 ArsTechnica也有文章。

【讨论】:

以上是关于rgb和hsl转换(js)的主要内容,如果未能解决你的问题,请参考以下文章

用MATLAB编写RGB到HSL和HSL到RGB颜色空间的转换程序:rgb2hsl.m和hsl2rgb.m

VB中HSL怎么转换为RGB?

使用 Objective C 从 RGB 转换为 HSL

Atitit  从 RGB 到 HSL 或 HSV 的转换

如何将 RGB 颜色转换为 HSV?

RGBYUVHSV和HSL区别和关联