先來了解一些概念:
1.RGB是一種加色模型,就是將不同比例的Red/Green/Blue混合在一起得到新顏色.通常RGB顏色模型表示為:
2.HSB(HSV) 通過色相/飽和度/亮度三要素來表達顏色.
H(Hue):表示顏色的類型(例如紅色,綠色或者黃色).取值范圍為0—360.其中每一個值代表一種顏色.
S(Saturation):顏色的飽和度.從0到1.有時候也稱為純度.(0表示灰度圖,1表示純的顏色)
B(Brightness or Value):顏色的明亮程度.從0到1.(0表示黑色,1表示特定飽和度的顏色)
后面地址是一個在線的觀察RGB到HSB轉換的工具:http://web.bentley.edu/empl/c/ncarter/MA307/color-converter.html
用RGB來表示顏色雖然方便,但是兩個相近的顏色的RGB值卻可能相差十萬八千里。用HSV(Hue色相、Saturation飽和度、Value(Brightness)明度,也叫HSB)來表示顏色就比較符合人們的習慣。
RGB到HSV(HSB)的轉換:
HSV(HSB)到RGB的轉換:
根據以上說明,有以下轉換公式(Java代碼):
- public static float[] rgb2hsb(int rgbR, int rgbG, int rgbB) {
- assert 0 <= rgbR && rgbR <= 255;
- assert 0 <= rgbG && rgbG <= 255;
- assert 0 <= rgbB && rgbB <= 255;
- int[] rgb = new int[] { rgbR, rgbG, rgbB };
- Arrays.sort(rgb);
- int max = rgb[2];
- int min = rgb[0];
- float hsbB = max / 255.0f;
- float hsbS = max == 0 ? 0 : (max - min) / (float) max;
- float hsbH = 0;
- if (max == rgbR && rgbG >= rgbB) {
- hsbH = (rgbG - rgbB) * 60f / (max - min) + 0;
- } else if (max == rgbR && rgbG < rgbB) {
- hsbH = (rgbG - rgbB) * 60f / (max - min) + 360;
- } else if (max == rgbG) {
- hsbH = (rgbB - rgbR) * 60f / (max - min) + 120;
- } else if (max == rgbB) {
- hsbH = (rgbR - rgbG) * 60f / (max - min) + 240;
- }
- return new float[] { hsbH, hsbS, hsbB };
- }
- public static int[] hsb2rgb(float h, float s, float v) {
- assert Float.compare(h, 0.0f) >= 0 && Float.compare(h, 360.0f) <= 0;
- assert Float.compare(s, 0.0f) >= 0 && Float.compare(s, 1.0f) <= 0;
- assert Float.compare(v, 0.0f) >= 0 && Float.compare(v, 1.0f) <= 0;
- float r = 0, g = 0, b = 0;
- int i = (int) ((h / 60) % 6);
- float f = (h / 60) - i;
- float p = v * (1 - s);
- float q = v * (1 - f * s);
- float t = v * (1 - (1 - f) * s);
- switch (i) {
- case 0:
- r = v;
- g = t;
- b = p;
- break;
- case 1:
- r = q;
- g = v;
- b = p;
- break;
- case 2:
- r = p;
- g = v;
- b = t;
- break;
- case 3:
- r = p;
- g = q;
- b = v;
- break;
- case 4:
- r = t;
- g = p;
- b = v;
- break;
- case 5:
- r = v;
- g = p;
- b = q;
- break;
- default:
- break;
- }
- return new int[] { (int) (r * 255.0), (int) (g * 255.0),
- (int) (b * 255.0) };
- }