Stoppt die Vorratsdatenspeicherung! Jetzt klicken && handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
 
Farbauswahl mit HSL
von Plapperkatze am 19.Februar 2006 um 16:39
zurück zur Kategorie "Tutorials"

HSL (Hue Saturation Lightness) ist ein Farbmodell wie RGB. Nur werden hier nicht Rot, Grün und Blau-Anteile gespeichert, sondern Farbwert, Sättigung und Helligkeit. Spätestens, wenn man ein stufenloses Farbfeld zeichnen will, ist HSL die einfachere Möglichkeit.

Wir haben 3 Werte, aber nur 2 Dimensionen auf dem Schirm. Einen Wert, den Farbton, stellen wir also getrennt dar als Farbbalken. Wird eine Farbe gewählt, kann in einer 2ten Anzeigefläche Sättigung und Helligkeit bestimmt werden.

Hier ein Sreenshot damit ihr seht was ich meine:


Um HSL Werte in RGB umzuwandeln, benutz ich folgende Funktion (nicht von mir!):
int HSLtoRGB(double h,double s,double l)
{
  double r,g,b,satr,satg,satb,ctmpr,ctmpg,ctmpb;

  while (h < 0)
     h += 360;
  while (h > 360)
     h -= 360;

  if (h < 120) {
     satr = (120 - h) / 60.0;
     satg = h / 60.0;
     satb = 0;
  } else if (h < 240) {
     satr = 0;
     satg = (240 - h) / 60.0;
     satb = (h - 120) / 60.0;
  } else {
     satr = (h - 240) / 60.0;
     satg = 0;
     satb = (360 - h) / 60.0;
  }
  if(satr>1)satr=1;
  if(satg>1)satg=1;
  if(satb>1)satb=1;

  ctmpr = 2 * s * satr + (1 - s);
  ctmpg = 2 * s * satg + (1 - s);
  ctmpb = 2 * s * satb + (1 - s);

  if (l < 0.5) {
     r = l * ctmpr;
     g = l * ctmpg;
     b = l * ctmpb;
  }    
  else
  {
     r = (1 - l) * ctmpr + 2 * l - 1;
     g = (1 - l) * ctmpg + 2 * l - 1;
     b = (1 - l) * ctmpb + 2 * l - 1;
  }

return RGB((int)(r*255),(int)(g*255),(int)(b*255));
}

Hue ist ein Double-Wert, in 0-360 sind alle Farben enthalten.
Saturation ist die Sättigung, 0-1 mit 1=maximale Sättigung.
Lightness ist die Helligkeit der Farbe, 0=schwarz, 1=weiss.
Der Rückgabewert ist ein int, der in CreateSolidBrush etc als Farbe verwendet werden kann.

Der Zeichencode für den Farbbalken sieht bei mir so aus:
     HDC hDC=BeginPaint(hWnd, &ps);
     int n;
     HPEN hpen;
     RECT rect={0,0,100,100};

     for(n=0;n<rect.bottom-rect.top;n++)
     {
       float f=(float)n*360/(rect.bottom-rect.top);
       hpen = CreatePen(PS_SOLID, 1,HSLtoRGB(f,1,.4));
       SelectObject(hDC, hpen);
       MoveToEx(hDC,0,n,NULL);
       LineTo(hDC,(rect.right-rect.left)/4,n);
       DeleteObject(hpen);
     }

Hier ist der Quelltext und das Executable (.rar, 25kB):
http://katze.dead-men.de/upload/27_hsl-tut.rar

gruesse, die plapperkatz

zurück zur Kategorie "Tutorials"
[0 Kommentare]

Name


Kommentar




Bitte abtippen


 
(C) 2006-20012 Plapperkatze - 215314 Besucher seit dem 23.01.2012 Login