# Colour Model Conversions

Does anybody out there know a decent RGB to HSL color model conversion algorithm.
LVL 4
###### Who is Participating?

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
This is NOT Delphi code as you can see.
There should not be a problem for you to port
this though.
From "Fundamentals of Interactive Computer Graphics" by Foley and van Dam:

void RGBtoHSL( COLORREF rgb, double *H, double *S, double *L )
{
double delta;
double r = (double)GetRValue(rgb)/255;
double g = (double)GetGValue(rgb)/255;
double b = (double)GetBValue(rgb)/255;
double cmax = max(r,max(g,b));
double cmin = min(r,min(g,b));
*L=(cmax+cmin)/2.0;
if(cmax==cmin) {
*S = 0;
*H = 0; // it's really undefined
} else {
if(*L < 0.5)
*S = (cmax-cmin)/(cmax+cmin);
else
*S = (cmax-cmin)/(2.0-cmax-cmin);
delta = cmax - cmin;
if(r==cmax)
*H = (g-b)/delta;
else if(g==cmax)
*H = 2.0 +(b-r)/delta;
else
*G=4.0+(r-g)/delta;
*H /= 6.0;
if(*H < 0.0)
*H += 1;
}
}

To convert HSL to RGB use code like this:

static double HuetoRGB(double m1, double m2, double h )
{
if( h < 0 ) h += 1.0;
if( h > 1 ) h -= 1.0;
if( 6.0*h < 1 )
return (m1+(m2-m1)*h*6.0);
if( 2.0*h < 1 )
return m2;
if( 3.0*h < 2.0 )
return (m1+(m2-m1)*((2.0/3.0)-h)*6.0);
return m1;
}

COLORREF HLStoRGB( double H, double L, double S )
{
double r,g,b;
double m1, m2;

if(S==0) {
r=g=b=L;
} else {
if(L <=0.5)
m2 = L*(1.0+S);
else
m2 = L+S-L*S;
m1 = 2.0*L-m2;
r = HuetoRGB(m1,m2,H+1.0/3.0);
g = HuetoRGB(m1,m2,H);
b = HuetoRGB(m1,m2,H-1.0/3.0);
}
return RGB((BYTE)(r*255),(BYTE)(g*255),(BYTE)(b*255));
}

0

Experts Exchange Solution brought to you by