近期在做颜色相关的东西,特此记录,便于追溯
概念讲解:
RGB:R(red)红、G(green)绿、B(blue)蓝;
HSL:H(Hue)色相、S(Saturation)饱和度、L(Lightness)明度;
RGU: 本质与RGB相同,不常用;
ESL:色调、饱和度、明度。
灰度:R=G=B
公式 R*0.299 + G*0.587 + B*0.114
或者R*0.3 + G*0.6 + B*0.1
C++代码
//HSL转RGB 亮度以及S按照255计算 如果需要按照不同L和S计算 除以需要计算的具体数值即可
int HSLToRGB(double Hue, double Saturation, double Lightness)
{
Saturation = Saturation / 255.0;
Lightness = Lightness / 255.0;
double C = (1 - abs(2 * Lightness - 1)) * Saturation;
double hh = Hue / 60.0;
double xiaoshu = hh - long(hh);
double X = C * (1 - abs((int)hh % 2 + xiaoshu - 1));
double r = 0, g = 0, b = 0;
if (hh >= 0 && hh < 1)
{
r = C;
g = X;
}
else if (hh >= 1 && hh < 2)
{
r = X;
g = C;
}
else if (hh >= 2 && hh < 3)
{
g = C;
b = X;
}
else if (hh >= 3 && hh < 4)
{
g = X;
b = C;
}
else if (hh >= 4 && hh < 5)
{
r = X;
b = C;
}
else
{
r = C;
b = X;
}
double m = Lightness - C / 2;
r += m;
g += m;
b += m;
r = r * 255.0;
g = g * 255.0;
b = b * 255.0;
r = round(r);
g = round(g);
b = round(b);
int addr = (int)b & 0xFF;
addr |= ((int)g << 8) & 0xFF00;
addr |= ((int)r << 16) & 0xFF0000;
return addr;
//return System.Drawing.Color.FromArgb((int)r, (int)g, (int)b);
}
//RGB转HSL
void RGBToHSL(int nColor, double &H, double &S, double &L)
{
double r = (0xff0000 & nColor) >> 16;
double g = (0xff00 & nColor) >> 8;
double b = 0xff & nColor;
r = r / 255;
g = g / 255;
b = b / 255;
double M = max(max(r, g), b);
double m = min(min(r, g), b);
double d = M - m;
//double dX =
if (d == 0) H = 0;
else if (M == r)
{
H = ((g - b) / d);
H = H + ((int)H % 6);
}
else if (M == g) H = (b - r) / d + 2;
else H = (r - g) / d + 4;
H *= 60;
if (H < 0) H += 360;
L = (M + m) / 2;
if (d == 0)
S = 0;
else
S = d / (1 - abs(2 * L - 1)); //如果放大或者缩小 乘以或者除以相应的倍数
S = S * 255; //由于是按照255计算的 所以最后乘以255
L = L * 255;
}
//C# RGB转HSL
public void RGBToHSL(System.Drawing.Color AColor, ref double H, ref double S, ref double L)
{
double r = AColor.R;
double g = AColor.G;
double b = AColor.B;
if (r < 0) r = 0;
if (g < 0) g = 0;
if (b < 0) b = 0;
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
r = r / 255;
g = g /255;
b = b / 255;
double M = Math.Max(Math.Max(r, g), b);
double m = Math.Min(Math.Min(r, g), b);
double d = M - m;
if (d == 0) H = 0;
else if (M == r) H = ((g - b) / d) % 6;
else if (M == g) H = (b - r) / d + 2;
else H = (r - g) / d + 4;
H *= 60;
if (H < 0) H += 360;
L = (M + m) / 2;
if (d == 0)
S = 0;
else
S = d / (1 - Math.Abs(2 * L - 1)); //如果放大或者缩小 乘以或者除以相应的倍数
S = S * 255;
L = L * 255;
}
//C# HSL转RGB
public System.Drawing.Color HslToRgb(double Hue, double Saturation, double Lightness)
{
if (Hue < 0) Hue = 0.0;
if (Saturation < 0) Saturation = 0.0;
if (Lightness < 0) Lightness = 0.0;
if (Hue >= 360) Hue = 359.0;
if (Saturation > 255) Saturation = 255;
if (Lightness > 255) Lightness = 255;
Saturation = Saturation /255.0;
Lightness = Lightness / 255.0;
double C = (1 - Math.Abs(2 * Lightness - 1)) * Saturation;
double hh = Hue / 60.0;
double X = C * (1 - Math.Abs(hh % 2 - 1));
double r =0, g =0 , b = 0;
if (hh >= 0 && hh < 1)
{
r = C;
g = X;
}
else if (hh >= 1 && hh < 2)
{
r = X;
g = C;
}
else if (hh >= 2 && hh < 3)
{
g = C;
b = X;
}
else if (hh >= 3 && hh < 4)
{
g = X;
b = C;
}
else if (hh >= 4 && hh < 5)
{
r = X;
b = C;
}
else
{
r = C;
b = X;
}
double m = Lightness - C / 2;
r += m;
g += m;
b += m;
r = r * 255.0;
g = g * 255.0;
b = b * 255.0;
r = Math.Round(r);
g = Math.Round(g);
b = Math.Round(b);
return System.Drawing.Color.FromArgb((int)r, (int)g, (int)b);
}