Colour Model Conversions

Does anybody out there know a decent RGB to HSL color model conversion algorithm.
LVL 4
StevenBAsked:
Who is Participating?
 
erajojConnect With a Mentor 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
 
StevenBAuthor Commented:
Cheers, Steven.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.