
functionHextoRGB(hex)...{
hex=hex.toUpperCase();
if(hex.charAt(0)=="#")hex=hex.substring(1,hex.length);
varrgb=newArray(3);
rgb.r=hex.substring(0,2);
rgb.g=hex.substring(2,4);
rgb.b=hex.substring(4,6);
rgb.r=parseInt(rgb.r,16);
rgb.g=parseInt(rgb.g,16);
rgb.b=parseInt(rgb.b,16);
if(isNaN(rgb.r))rgb.r=0;
if(isNaN(rgb.g))rgb.g=0;
if(isNaN(rgb.b))rgb.b=0;
returnrgb;
}

functionRGBtoHex(R,G,B)...{
varn=Math.round(B);
n+=Math.round(G)<<8;
n+=Math.round(R)<<16;
returnDectoHex(n);
}
//turnsdecimalinteger(e.g.,bgColor)intohexadecimalstring

functionDectoHex(num)...{
vari=0;varj=20;
varstr="#";

while(j>=0)...{
i=(num>>j)%16;

if(i>=10)...{
if(i==10)str+="A";
elseif(i==11)str+="B";
elseif(i==12)str+="C";
elseif(i==13)str+="D";
elseif(i==14)str+="E";
elsestr+="F";
}else
str+=i;
j-=4;
}
returnstr;
}

functionMIN()...{
varmin=255;
for(vari=0;i<arguments.length;i++)
if(arguments[i]<min)
min=arguments[i];
returnmin;
}

functionMAX()...{
varmax=0;
for(vari=0;i<arguments.length;i++)
if(arguments[i]>max)
max=arguments[i];
returnmax;
}

functionRGBtoCMYK(r,g,b)...{//doesn'tdistort!notreallyusable...
r/=255;
g/=255;
b/=255;
varcmyk=newArray(4);
cmyk.c=Math.pow(1-r,.45);
cmyk.m=Math.pow(1-g,.45);
cmyk.y=Math.pow(1-b,.45);
cmyk.k=MIN(cmyk.c,cmyk.y,cmyk.m);
cmyk.c-=cmyk.k;
cmyk.m-=cmyk.k;
cmyk.y-=cmyk.k;
returncmyk;
}

functionRGBtoHSV(r,g,b)...{
r/=255;
g/=255;
b/=255;
varmin,max,delta;
varhsv=newArray(3);
min=MIN(r,g,b);
max=MAX(r,g,b);
hsv.v=max;
delta=max-min;
if(max!=0)hsv.s=delta/max;

else...{
hsv.s=.005;
hsv.h=0;
returnhsv;
}

if(delta==0)...{
hsv.s=.005;
hsv.h=0;
returnhsv;
}
if(r==max)hsv.h=(g-b)/delta;
elseif(g==max)hsv.h=2+(b-r)/delta;
elsehsv.h=4+(r-g)/delta;
hsv.h*=60;
if(hsv.h<0)hsv.h+=360;
if(hsv.h>=360)hsv.h-=360;
returnhsv;
}

functionHSVtoRGB(h,s,v)...{
varrgb=newArray(3);
vari;
varf,p,q,t;

if(s==0)...{
rgb.r=rgb.g=rgb.b=v*255;
returnrgb;
}
h/=60;
i=Math.floor(h);
f=h-i;
p=v*(1-s);
q=v*(1-s*f);
t=v*(1-s*(1-f));

switch(i)...{
case0:
rgb.r=v;
rgb.g=t;
rgb.b=p;
break;
case1:
rgb.r=q;
rgb.g=v;
rgb.b=p;
break;
case2:
rgb.r=p;
rgb.g=v;
rgb.b=t;
break;
case3:
rgb.r=p;
rgb.g=q;
rgb.b=v;
break;
case4:
rgb.r=t;
rgb.g=p;
rgb.b=v;
break;
default:
rgb.r=v;
rgb.g=p;
rgb.b=q;
break;
}
rgb.r*=255;
rgb.g*=255;
rgb.b*=255;
returnrgb;
}

functionRGBtoHLS(R,G,B)...{
R/=255;
G/=255;
B/=255;
varmax,min,diff,r_dist,g_dist,b_dist;
varhls=newArray(3);
max=MAX(R,G,B);
min=MIN(R,G,B);
diff=max-min;
hls.l=(max+min)/2;

if(diff==0)...{
hls.h=0;
hls.s=0;

}else...{
if(hls.l<0.5)hls.s=diff/(max+min);
elsehls.s=diff/(2-max-min);
r_dist=(max-R)/diff;
g_dist=(max-G)/diff;
b_dist=(max-B)/diff;

if(R==max)...{hls.h=b_dist-g_dist;}

elseif(G==max)...{hls.h=2+r_dist-b_dist;}

elseif(B==max)...{hls.h=4+g_dist-r_dist;}
hls.h*=60;
if(hls.h<0)hls.h+=360;
if(hls.h>=360)hls.h-=360;
}
returnhls;
}

functionRGB(q1,q2,hue)...{
if(hue>360)hue=hue-360;
if(hue<0)hue=hue+360;
if(hue<60)return(q1+(q2-q1)*hue/60);
elseif(hue<180)return(q2);
elseif(hue<240)return(q1+(q2-q1)*(240-hue)/60);
elsereturn(q1);
}

functionHLStoRGB(H,L,S)...{
varp1,p2;
varrgb=newArray(3);
if(L<=0.5)p2=L*(1+S);
elsep2=L+S-(L*S);
p1=2*L-p2;

if(S==0)...{
rgb.r=L;
rgb.g=L;
rgb.b=L;

}else...{
rgb.r=RGB(p1,p2,H+120);
rgb.g=RGB(p1,p2,H);
rgb.b=RGB(p1,p2,H-120);
}
rgb.r*=255;
rgb.g*=255;
rgb.b*=255;
returnrgb;
}
RGB 0~255
H 0~359
S、L、V 0~100
要注意的是 HLS和HSV模式转RGB的函数,输入的 L/S或者S/V值要预先除以100
找了很久才找到的,总会有用到的时候吧(我现在就正好要用到)
另外提供WEB216安全色的算法(这个其实很简单-_-bbb 附赠品 :p)
输入的值是字符串#3E6A95 这样的

functionsnaptoSafe(c)...{
varsafe=newArray;
safe[0]=parseInt(c.substr(1,2),16);
safe[1]=parseInt(c.substr(3,2),16);
safe[2]=parseInt(c.substr(5,2),16);
vari;

for(i=0;i<safe.length;i++)...{
safe[i]=Math.round(safe[i]/51)*51;
safe[i]=safe[i].toString(16);
if(safe[i].length<2)safe[i]='0'+safe[i];
}
varthecolor='#'+safe[0]+safe[1]+safe[2];
returnthecolor;
}
返回离该色彩最近的安全色