void RGB2HSL(LONG cr, double &H, double &S, double &L)
{
double R, G, B, Max, Min, DelMax;
byte *pTemp = (byte *)&cr;
R = (double)*pTemp / 255.0;
G = (double)*(pTemp + 1) / 255.0;
B = (double)*(pTemp + 2) / 255.0;
Min = min(R, min(G, B));
Max = max(R, max(G, B));
DelMax = Max - Min;
L = (Max + Min) / 2.0;
if (Max == Min)
{
H = 0;
S = 0;
}
else
{
if (Max == R)
H = (G - B) / DelMax / 6.0;
else if(Max == G)
H = (B - R) / DelMax / 6.0 + 1.0 / 3.0;
else if (Max == B)
H = (R - G) / DelMax / 6.0 + 2.0 / 3.0;
if (H < 0)
H += 1.0;
if (L > 0.5)
S = DelMax / (2 - Max - Min);
else
S = DelMax / (Max + Min);
}
}
double Hue2RGB(double v1, double v2, double vH)
{
if (vH < 0) vH += 1.0;
if (vH > 1) vH -= 1.0;
if (6.0 * vH < 1) return v1 + (v2 - v1) * 6.0 * vH;
if (2.0 * vH < 1) return v2;
if (3.0 * vH < 2) return v1 + (v2 - v1) * ((2.0 / 3.0) - vH) * 6.0;
return (v1);
}
void HSL2RGB(double H, double S, double L, ULONG& cr)
{
double R, G, B;
double Max, Min, DelMax;
if (S == 0)
{
R = L;
G = L;
B = L;
}
else
{
if (L <= 0.5)
Max = L * (1 + S);
else
Max = L + S - L * S;
Min = 2 * L - Max;
DelMax = Max - Min;
R = Hue2RGB(Min, Max, H + (1.0 / 3.0));
G = Hue2RGB(Min, Max, H);
B = Hue2RGB(Min, Max, H - (1.0 / 3.0));
}
byte *pTemp = (byte *)&cr;
*pTemp = R * 255;
*(pTemp + 1) = G * 255;
*(pTemp + 2) = B * 255;
}
HSL和RGB的相互转换
最新推荐文章于 2024-03-12 16:05:37 发布