概念
-
RGB色彩模式
- RGB色彩模式,即R:Red(红),G:Green(绿),B:Blue(蓝),3个颜色通道值的大小和层叠来得到各式各样的颜色。
-
HSB色彩模式
- HSB色彩模式,即色度、饱和度、亮度模式。它采用颜色的三属性来表色。H:hue,即色调(色度),S:saturation(饱和度),B:brightness明度(亮度)。
- 其中,S和B,饱和度和亮度,值为百分比(0% ~ 100%)。而色度,以角度(0°-360°)来表示。
既然有了RGB,为何还需要HSB?
众所周知,人眼所能看见的颜色都可以通过三原色RGB混合获得,其每个颜色分量分别为红(R)、绿(G)、蓝(B)。然而这只是颜色一种表示方法,这种表示方法非常适合机器却非常的反人性。
转换工具类
/**
* HSB和RGB颜色之间转换的工具类
*/
public class HSBColorUtil {
private HSBColorUtil() {
}
/**
* RGB转HSB
*
* @param r RBG的R
* @param g RBG的G
* @param b RBG的B
* @param hsbvals HSB 3个值存放到这个数组
* @return 返回HSB数组
*/
public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) {
float hue, saturation, brightness;
if (hsbvals == null) {
hsbvals = new float[3];
}
int cmax = (r > g) ? r : g;
if (b > cmax) cmax = b;
int cmin = (r < g) ? r : g;
if (b < cmin) cmin = b;
brightness = ((float) cmax) / 255.0f;
if (cmax != 0)
saturation = ((float) (cmax - cmin)) / ((float) cmax);
else
saturation = 0;
if (saturation == 0)
hue = 0;
else {
float redc = ((float) (cmax - r)) / ((float) (cmax - cmin));
float greenc = ((float) (cmax - g)) / ((float) (cmax - cmin));
float bluec = ((float) (cmax - b)) / ((float) (cmax - cmin));
if (r == cmax)
hue = bluec - greenc;
else if (g == cmax)
hue = 2.0f + redc - bluec;
else
hue = 4.0f + greenc - redc;
hue = hue / 6.0f;
if (hue < 0)
hue = hue + 1.0f;
}
hsbvals[0] = hue;
hsbvals[1] = saturation;
hsbvals[2] = brightness;
return hsbvals;
}
/**
* HSB颜色值,转RGB
*
* @param hue HSB的h,色调
* @param saturation HSB的s,饱和度
* @param brightness HSB的b,明度
* @return 返回RGB值
*/
public static int HSBtoRGB(float hue, float saturation, float brightness) {
int r = 0, g = 0, b = 0;
if (saturation == 0) {
r = g = b = (int) (brightness * 255.0f + 0.5f);
} else {
float h = (hue - (float) Math.floor(hue)) * 6.0f;
float f = h - (float) java.lang.Math.floor(h);
float p = brightness * (1.0f - saturation);
float q = brightness * (1.0f - saturation * f);
float t = brightness * (1.0f - (saturation * (1.0f - f)));
switch ((int) h) {
case 0:
r = (int) (brightness * 255.0f + 0.5f);
g = (int) (t * 255.0f + 0.5f);
b = (int) (p * 255.0f + 0.5f);
break;
case 1:
r = (int) (q * 255.0f + 0.5f);
g = (int) (brightness * 255.0f + 0.5f);
b = (int) (p * 255.0f + 0.5f);
break;
case 2:
r = (int) (p * 255.0f + 0.5f);
g = (int) (brightness * 255.0f + 0.5f);
b = (int) (t * 255.0f + 0.5f);
break;
case 3:
r = (int) (p * 255.0f + 0.5f);
g = (int) (q * 255.0f + 0.5f);
b = (int) (brightness * 255.0f + 0.5f);
break;
case 4:
r = (int) (t * 255.0f + 0.5f);
g = (int) (p * 255.0f + 0.5f);
b = (int) (brightness * 255.0f + 0.5f);
break;
case 5:
r = (int) (brightness * 255.0f + 0.5f);
g = (int) (p * 255.0f + 0.5f);
b = (int) (q * 255.0f + 0.5f);
break;
}
}
return 0xff000000 | (r << 16) | (g << 8) | (b << 0);
}
}
示例
- 字符串颜色值转RBG值
/**
* 字符串颜色值转int颜色值
*/
private static int colorStr2Int(String colorStr) {
try {
return Color.parseColor(colorStr);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
- RGB转HSB数组
/**
* RGB颜色值转HSB颜色值,返回HSB颜色值的3个值数组
*/
private static float[] colorInt2HSB(int colorInt) {
float[] hsbArr = new float[3];
hsbArr = HSBColorUtil.RGBtoHSB(
Color.red(colorInt),
Color.green(colorInt),
Color.blue(colorInt),
hsbArr
);
return hsbArr;
}
- 将颜色值转HSB,并将B亮度乘以0.9(调暗),并转回RBG值
int themeColorInt = colorStr2Int("#314F62");
float[] hsbArr = colorInt2HSB(themeColorInt);
//色调
float hue = hsbArr[0];
//饱和度
float saturation = hsbArr[1];
//明度
float brightness = hsbArr[2];
//重点:对明度进行调整(调暗)
float newBrightness = (Math.round(brightness * 100f * 0.9f)) / 100f;
//把HSB转回RGB颜色返回
int result = HSBColorUtil.HSBtoRGB(hue, saturation, newBrightness);
网友评论