/**
* 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};
}