HSV,HSL颜色表示与RGB的互转

RGB之外几种常用颜色表达

  • HSL 表示 hue(色相)、saturation(饱和度)、lightness(亮度)
  • HSV 表示 hue(色相)、saturation(饱和度)、value(色调)
  • HSB 表示 hue(色相)、saturation(饱和度)、brightness(明度)

HSV

这里写图片描述

C#实现


//HSV->RGB
public static Color ColorFromHSV(float h, float s, float v, float a = 1)
{
        if (s == 0)
            return new Color(v, v, v, a);

        float sector = h / 60;

        int i = (int)sector;
        float f = sector - i;

        float p = v * (1 - s);
        float q = v * (1 - s * f);
        float t = v * (1 - s * (1 - f));

        Color color = new Color(0, 0, 0, a);

        switch(i)
        {
            case 0:
                color.r = v;
                color.g = t;
                color.b = p;
                break;

            case 1:
                color.r = q;
                color.g = v;
                color.b = p;
                break;

            case 2:
                color.r  = p;
                color.g  = v;
                color.b  = t;
                break;

            case 3:
                color.r  = p;
                color.g  = q;
                color.b  = v;
                break;

            case 4:
                color.r  = t;
                color.g  = p;
                color.b  = v;
                break;

            default:
                color.r  = v;
                color.g  = p;
                color.b  = q;
                break;
        }

        return color;
}

//RGB->HSV
public static void ColorToHSV(Color color, out float h, out float s, out float v)
{
        float min = Mathf.Min(Mathf.Min(color.r, color.g), color.b);
        float max = Mathf.Max(Mathf.Max(color.r, color.g), color.b);
        float delta = max - min;

        v = max;


        if (!Mathf.Approximately(max, 0))
            s = delta / max;
        else{
            s = 0;
            h = -1;
            return;
        }


        if (Mathf.Approximately(min, max))
        {
            v = max;
            s = 0;
            h = -1;
            return;
        }

        if (color.r == max)
            h = (color.g - color.b) / delta;
        else if (color.g == max)
            h = 2 + (color.b - color.r) / delta;                
        else
            h = 4 + (color.r - color.g) / delta;                

        h *= 60;
        if (h < 0 )
            h += 360;
}

CG Shader实现

待补

HSL

这里写图片描述

C#实现

public static Color HSL2RGB(float h, float s, float l, float a = 1)
{
    float r,g,b;
    r = l;
    g = l;
    b = l;

    float v = (l <= 0.5f) ? (l * (1 + s)) : (l + s - l * s);
    if (v > 0)
    {
        float m = l + l - v;

        float sv = (v - m )/ v;

        h *= 6.0;

        int sextant = (int)h;

        float fract = h - sextant;

        float vsf = v * sv * fract;

        float mid1 = m + vsf;

        float mid2 = v - vsf;

        switch (sextant)
        {
            case 0:
                r = v;
                g = mid1;
                b = m;
                break;
            case 1:
                r = mid2;
                g = v;
                b = m;
                break;
            case 2:
                r = m;
                g = v;
                b = mid1;
                break;

            case 3:
                r = m;
                g = mid2;
                b = v;
                break;
            case 4:
                r = mid1;
                g = m;
                b = v;
                break;
            case 5:
                r = v;
                g = m;
                b = mid2;
                break;
        }
    }

    Color rgb = new Color(r * 255,g*255,b*255,a);
    return rgb;

}
    // Return H,S,L in range of 0-1
public static void RGB2HSL (Color rgb, out float h, out float s, out float l)
{

        float r = rgb.r/255;
        float g = rgb.g/255;
        float b = rgb.b/255;

        h = 0; 
        s = 0;
        l = 0;

        float v = Mathf.Max(r,g,b);
        float m = Mathf.Min(r,g,b);

        l = (m + v) / 2.0;
        if (l <= 0)
            return;

        float vm = v - m;

        s = vm;

        if (s > 0.0)
            s /= (l <= 0.5) ? (v + m ) : (2.0 - v - m);
        else
            return;

        float r2 = (v - r) / vm;

        float g2 = (v - g) / vm;

        float b2 = (v - b) / vm;


        if (r == v)
            h = (g == m ? 5.0 + b2 : 1.0 - g2);
        else if (g == v)
            h = (b == m ? 1.0 + r2 : 3.0 - b2);
        else
            h = (r == m ? 3.0 + g2 : 5.0 - r2);

        h /= 6f;
}

CG Shader实现

待补
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值