Danke Euch!
Also ich habe gut 2 Tage alles mögliche zu Farben gelesen... Ist schon interessant.
Für alle, denen das etwas hilft, hier ein kleines Testprojekt mit meinen 2 Funktionen.
Damit sind Helligkeitsänderungen kein Problem (mehr).
Delphi-Quellcode:
uses
GraphUtil; // !!
procedure TForm1.Button1Click(Sender: TObject);
begin
ColorDialog1.Execute();
Panel2.Color:=ColorDialog1.Color;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
// festen Helligkeitswert zuweisen (0=schwarz .. 240=weiß)
function ColorLightness(clrRGB:TColor;Lightness:Integer):TColor;
var H,L,S:Word;
begin
if (Lightness<0) then Lightness:=0;
if (Lightness>240) then Lightness:=240;
ColorRGBToHLS(ColorToRGB(clrRGB),H,L,S);
Result:=TColor(ColorHLSToRGB(H,Lightness,S));
end;
// Helligkeitsdifferenz zuweisen (-240..240)
// Wird die Helligkeit >240 oder <0 wird die Richtung umgedreht
// bzw entsprechend begrenzt
function ColorLightnessMove(clrRGB:TColor;Lightness:Integer):TColor;
var H,L,S:Word;
I:Integer;
begin
if (Lightness<-240) then Lightness:=-240;
if (Lightness>240) then Lightness:=240;
ColorRGBToHLS(ColorToRGB(clrRGB),H,L,S);
I:=(L+Lightness);
if (I>240) then begin
if (L<=120) then I:=240
else begin
I:=(L-(I-L));
if (I<0) then I:=0;
end;
end;
if (I<0) then begin
if (L>120) then I:=0
else begin
I:=(L+(L-I));
if (I>240) then I:=240;
end;
end;
Result:=TColor(ColorHLSToRGB(H,I,S));
end;
begin
Panel2.Caption:=IntToStr(TrackBar1.Position);
Panel1.Color:=GetHighLightColor(Panel2.Color,TrackBar1.Position);
Panel3.Color:=GetShadowColor(Panel2.Color,TrackBar1.Position);
Panel4.Color:=ColorLightness(Panel2.Color,TrackBar1.Position);
Panel5.Color:=ColorLightnessMove(Panel2.Color,TrackBar1.Position);
end;
Stahli
EDIT: Alle Maximalwerte 255 mussten natürlich in 240 geändert werden, da der Helligkeitsbereich 0..240 ist.