1、RGB
RGB是色光的色彩模式。即红 (Red)、绿 (Green)、蓝 (Blue)三原色的简称。三种色彩叠加形成了其它的色彩。因为三种颜色都有256个亮度水平级,所以三种色彩叠加就形成1670万种颜色了。也就是真彩 色,通过它们足以在现绚丽的世界。我们日常用的彩色电脑显示器、彩色电视机等的色彩都使用这种模式,在Photoshop使用RGB色彩模式编辑图像时的通道窗口中我们可以看到组成这幅画 面的三种通道。在RGB模式中,由红、绿、蓝相叠加可以产生其它颜色,因此该模式也叫加色模式。所有显示器、投影设备以及电视机等等许多设备都依赖于这种 加色模式来实现的。就编辑图象而言,RGB色彩模式也是最佳的色彩模式,因为它可以提供全屏幕的24bit的色彩范围,即真彩色显示。但是,如果将RGB模式用于打印就不是 最佳的了,因为RGB模式所提供的有些色彩已经超出了打印的范围之外,因此在打印一幅真彩色的图象时,就必然会损失一部分亮度,并且比较鲜艳的色彩肯定会 失真的。。这主要因为打印所用的是CMYK模式,而CMYK模式所定义的色彩要比RGB模式定义的色彩少很多,因此打印时,系统自动将RGB模式转换为 CMYK模式,这样就难免损失一部分颜色,出现打印后失真的现象。
2、HSB
HSB是以人类对颜色的感觉为依据而建立的,在HSB模式中,所有的颜色都是根据下列三种基本特征来进行形容和描述的。
色相(Hue):是由物体发射或反射出来的颜色。它是根据色彩在一个0-360的标准色盘上的位置来决定的,通常以颜色的名称来辨识,例如红、橙和绿等等,红色在0度,绿色在120度,蓝色在240度。它基本上是RGB模式全色度的饼状图。
饱和度(Saturation):表示色彩的纯度,有时也被称为彩度,为0%时为灰色。白、黑和其他灰色色彩都没有饱和度的。在最大饱和度时,每一色相具有最纯的色光。
亮度(Brightness):是指颜色相对的亮度和暗度,通常是用为0%(黑)到100%(白)的方式进行测定。
转换公式:
/**
* 将HSB颜色格式转换成RGB格式。
*
* @param H Hue
* @param S Saturation
* @param B Brightness
* @return hash rgb color hash
*/
var HSB_2_RGB = function(H, S, B) {
var rgb = {R:0, G:0, B:0};
H = (H >= 360) ? 0 : H;
if(S == 0) {
rgb.R = B * 255;
rgb.G = B * 255;
rgb.B = B * 255;
} else {
i = Math.floor(H / 60) % 6;
f = H / 60 - i;
p = B * (1 - S);
q = B * (1 - S * f);
t = B * (1 - S * (1 - f));
switch(hi) {
case 0:
rgb.R = B, rgb.G = t, rgb.B = p;
break;
case 1:
rgb.R = q; rgb.G = B; rgb.B = p;
break;
case 2:
rgb.R = p; rgb.G = B; rgb.B = t;
break;
case 3:
rgb.R = p; rgb.G = q; rgb.B = B;
break;
case 4:
rgb.R = t; rgb.G = p; rgb.B = B;
break;
case 5:
rgb.R = B; rgb.G = p; rgb.B = q;
break;
}
rgb.R = rgb.R * 255;
rgb.G = rgb.G * 255;
rgb.B = rgb.B * 255;
}
return rgb;
};
/**
* 将RGB颜色格式转换成HSB格式。
*
* @param R Red
* @param G Green
* @param B Blue
* @return hash hsb color
*/
var RGB_2_HSB = function(R, G, B) {
var var_Min = Math.min(Math.min(R, G), B);
var var_Max = Math.max(Math.max(R, G), B);
var hsb = {H:0, S:0, B:0};
if(var_Min == var_Max) {
hsb.H = 0;
} else if(var_Max == R && G >= B) {
hsb.H = 60 * ( (G - B) / (var_Max - var_Min) );
} else if(var_Max == R && G < B) {
hsb.H = 60 * ( (G - B) / (var_Max - var_Min) ) + 360;
} else if(var_Max == G) {
hsb.H = 60 * ( (B - R) / (var_Max - var_Min) ) + 120;
} else if(var_Max == B) {
hsb.H = 60 * ( (R - G) / (var_Max - var_Min) ) + 240;
}
if(var_Max == 0) {
hsb.S = 0;
} else {
hsb.S = 1 - (var_Min / var_Max);
}
var var_R = (R / 255);
var var_G = (G / 255);
var var_B = (B / 255);
hsb.B = Math.max(Math.max(var_R, var_G), var_B);
hsb.H = (hsb.H >= 360) ? 0 : hsb.H;
return hsb;
};