Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

Colour Model Conversions

Posted on 1997-04-21
Medium Priority
200 Views
Does anybody out there know a decent RGB to HSL color model conversion algorithm.
0
Question by:StevenB
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points

LVL 4

Accepted Solution

erajoj earned 100 total points
ID: 1335564
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

LVL 4

Author Comment

ID: 1335565
Cheers, Steven.
0

Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question