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