色彩模式转换函数

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

返回离该色彩最近的安全色

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值