Entwickler-Ecke

Sonstiges (Delphi) - HLS zu RGB (Wo liegt mein Fehler?)


pmw - Fr 17.01.03 17:35
Titel: HLS zu RGB (Wo liegt mein Fehler?)
Hallo!

Ich habe unter http://plaza27.mbn.or.jp/~satomii/design/win32/hls2rgb.html einen Algoritmus gefunden um HLS (Farbe,Helligkeit,Sättigung) zu RGB (Rot,Grün,Blau) umzuwandeln. Leider war der Code in C, deshalb habe ich ihn in Delphi umgeschrieben.
Für die meisten Werte klappt der Code sehr gut. Aber wenn die Werte für R,G oder B >= FE sind kommen nur noch unsinnige Werte raus:


Quelltext
1:
z.B.: HLS-Wert: 43C864 - Das Programm macht draus: 000004, es sollte aber 00FE00 rauskommen!                    


Mein Code (Vorlage [http://plaza27.mbn.or.jp/~satomii/design/win32/hls2rgb.html]):

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
function HSLtoRGB(H,S,L: byte): String;
var
R,G,B: byte;
Magic1,Magic2: double;

   function HueToRGB(n1,n2,hue: double): double;
   begin

      if (hue < 0) then hue := hue + 200;
      if (hue > 200) then hue := hue - 200;

      if hue < (200/6) then
         result := (n1 + (((n2-n1)*hue + (200/12))/(200/6)))
      else if hue < (200/2) then
         result := (n2)
      else if hue < ((200*2)/3) then
         result := (n1 + (((n2-n1)*(((200*2)/3)-hue) + (200/12))/(200/6)))
      else
         result := (n1);

    end;

begin

   if S = 0 then begin
      R := round(L * 255 / 200);
      G := round(L * 255 / 200);
      B := round(L * 255 / 200);
   end

   else begin

      if L <= (200/2) then
         Magic2 := round((L*(200+S)+(200/2)) / 200)
      else
         Magic2 := round(L + S - ((L*S)+(200/2)) / 200);
      Magic1 := 2*L - Magic2;

      R := round( (HueToRGB(Magic1, Magic2, (H+(200/3))) * 255 + (200/2)) / 200 );
      G := round( (HueToRGB(Magic1, Magic2, H) * 255 + (200/2)) / 200 );
      B := round( (HueToRGB(Magic1, Magic2, (H-(200/3))) * 255 + (200/2)) / 200 );

   end;

   result := IntToHex(round(R),2)+IntToHex(round(G),2)+IntToHex(round(B),2);

end;


Viele Grüße
Martin Winandy