RGB,HSL,HSV相互转换

/**
 * RGB转换为HSL
 * @param {float} r Red分量,0~1
 * @param {float} g Green分量,0~1
 * @param {float} b Blue分量,0~1
 * @returns {object} HSL色值
 */
function rgbToHsl(r,g,b)
{
    var max=r;
    if(g>max)
        max=g;
    if(b>max)
        max=b;
    var min=r;
    if(g<min)
        min=g;
    if(b<min)
        min=b;

    var h,s,l;

    if(max==min)
        h=0;
    else if(max==r && g>=b)
        h=60*(g-b)/(max-min)+0;
    else if(max==r && g<b)
        h=60*(g-b)/(max-min)+360;
    else if(max==g)
        h=60*(b-r)/(max-min)+120;
    else if(max==b)
        h=60*(r-g)/(max-min)+240;

    l=(max+min)/2;

    if(l==0 || max==min)
        s=0;
    else if(l>0 && l<=0.5)
        s=(max-min)/(2*l);
    else if(l>0.5)
        s=(max-min)/(2-2*l);

    return {h,s,l}; 
}

/**
 * HSL转换为RGB
 * @param {float} h Hue分量,0~359
 * @param {float} s Saturation分量,0~1
 * @param {float} l Lightness分量,0~1
 * @returns {object} RGB色值,小数
 */
function hslToRgb(h,s,l)
{
    var temp1;
    if(l<0.5)
        temp1=l*(1+s);
    else
        temp1=l+s-(l*s);
    var temp2=2*l-temp1;
    var hNormlized=h/360;
    var tempRgb=new Array(3);
    tempRgb[0]=hNormlized+1/3;
    tempRgb[1]=hNormlized;
    tempRgb[2]=hNormlized-1/3;

    for(var i=0;i<3;i++)
    {
        if(tempRgb[i]<0)
            tempRgb[i]+=1;
        else if(tempRgb[i]>1)
            tempRgb[i]-=1;
    }

    
    var rgb=new Array(3);
    for(var i=0;i<3;i++)
    {
        if(tempRgb[i]<1/6)
            rgb[i]=temp2+((temp1-temp2)*6*tempRgb[i]);
        else if(tempRgb[i]>=1/6 && tempRgb[i]<1/2)
            rgb[i]=temp1;
        else if(tempRgb[i]>=1/2 && tempRgb[i]<2/3)
            rgb[i]=temp2+((temp1-temp2)*6*(2/3-tempRgb[i]));
        else 
            rgb[i]=temp2;
    }

    return {r:rgb[0],g:rgb[1],b:rgb[2]};
}

/**
 * RGB转换为HSV
 * @param {float} r Red分量,0~1
 * @param {float} g Green分量,0~1
 * @param {float} b Blue分量,0~1
 * @returns {object} HSV色值
 */
function rgbToHsv(r,g,b)
{
    var max=r;
    if(g>max)
        max=g;
    if(b>max)
        max=b;
    var min=r;
    if(g<min)
        min=g;
    if(b<min)
        min=b;

    var h,s,v;

    if(max==min)
        h=0;
    else if(max==r && g>=b)
        h=60*(g-b)/(max-min)+0;
    else if(max==r && g<b)
        h=60*(g-b)/(max-min)+360;
    else if(max==g)
        h=60*(b-r)/(max-min)+120;
    else if(max==b)
        h=60*(r-g)/(max-min)+240;

    if(max==0)
        s=0;
    else 
        s=1-min/max;

    v=max;

    return {h,s,v}; 
}

/**
 * HSV转换为RGB
 * @param {float} h Hue分量,0~359
 * @param {float} s Saturation分量,0~1
 * @param {float} v Value分量,0~1
 * @returns {object} RGB色值,小数
 */
function hsvToRgb(h,s,v)
{
    var tempH=Math.floor(h/60);
    var temp1=h/60-tempH;
    var temp2=v*(1-s);
    var temp3=v*(1-temp1*s);
    var temp4=v*(1-(1-temp1)*s);

    var rgb; 
    switch(tempH)
    {
        case 0:
            rgb={r:v,g:temp4,b:temp2};
            break;
        case 1:
            rgb={r:temp3,g:v,b:temp2};
            break;
        case 2:
            rgb={r:temp2,g:v,b:temp4};
            break;
        case 3:
            rgb={r:temp2,g:temp3,b:v};
            break;
        case 4:
            rgb={r:temp4,g:temp2,b:v};
            break;
        case 5:
            rgb={r:v,g:temp2,b:temp3};
            break;
    }

    return rgb;
}

/**
 * HSV转换为HSL
 * @param {float} h Hue分量,0~359
 * @param {float} s Saturation分量,0~1
 * @param {float} v Value分量,0~1
 * @returns {object} HSL色值,小数
 */
function hsvToHsl(h,s,v)
{
    var hHsl,sHsl,l;

    hHsl=h;

    if(v==0)
    {
        sHsl=0;
        l=0;
    }
    else if(v<=1/(2-s))
    {
        sHsl=s/(2-s);
        l=(2*v-v*s)/2;   
    }
    else
    {
        sHsl=v*s/(2-2*v+v*s);
        l=(2*v-v*s)/2; 
    }
        
    return {h:hHsl,s:sHsl,l};
}

/**
 * HSL转换为HSV
 * @param {float} h Hue分量,0~359
 * @param {float} s Saturation分量,0~1
 * @param {float} l Lightness分量,0~1
 * @returns {object} HSV色值,小数
 */
function hslToHsv(h,s,l)
{
    var hHsv,sHsv,v;

    hHsv=h;

    if(l==0)
    {
        sHsv=0;
        v=0;
    }
    else if(l>0 && l<=0.5)
    {
        sHsv=2*s/(1+s);
        v=l*(1+s);
    }
    else
    {
        sHsv=(2*s-2*s*l)/(s-s*l+l);
        v=s-s*l+l;
    }

    return {h:hHsv,s:sHsv,v};
}

 

转载于:https://my.oschina.net/skywingjiang/blog/879871

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值