![]() |
Farbhelligkeit verändern...
Hallo zusammen,
ich möchte in meiner Anwendung einige Farben heller oder dunkler machen. Das ist zwar nicht sehr wichtig, aber ich habe mich daran etwas festgebissen. Ich denke, das wird sicher häufiger mal gebraucht werden, daher will ich hier mal einen Thread eröffen: Mein aktueller Stand... - RGB-Farben können nicht einfach in der Helligkeit verändert werden - sie müssen in ein anderes Farbsystem (Cie LAB) umgewandelt werden, das über einen eigenen Helligkeitswert verfügt - dann wird die Helligkeit geändert - und die Farbe wieder in RGB konvertiert einige Links... ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Der letzte Link enthält eine Umrechnungsformel, mit der ich aber trotzdem nicht klar komme ;-( Was mich aber grundsätzlich daran stört: Der Helligkeitswert L bei LAB liegt im Bereich 0..100. Im Color-Dialog von Delphi gibt es aber einen Bereich von 0..240 Farbt. 0..239 Sätt. 0..240 Hell. 0..240 Also wird dort wohl eine andere (bessere?) Umrechnung verwendet. Eine eigene Umrechnungsfunktion sollte natürlich bestenfalls mit den „gewohnten“ Werten funktionieren. Weiß jemand, wie diese RGB-Umrechnung funktioniert? Eine Funktion stelle ich mir dann so vor:
Delphi-Quellcode:
Stahli
NewColor:=ColorHellDif(OldColor,10); // 10 Werte heller
NewColor:=ColorHellDif(OldColor,-10); // 10 Werte dunkler NewColor:=ColorHell(OldColor,10); // alsoluter Wert=10 |
Re: Farbhelligkeit verändern...
Hallo Stahli,
schau dir doch einmal die Unit GraphUtil an... Gruß Hawkeye |
Re: Farbhelligkeit verändern...
Also mit LAB würde ich hier nicht anfangen.
Nimm einfach das HSL (Hue, Saturation, Lightness) Modell und ändere dort die Helligkeit. siehe auch: ![]() Eine implementierung für TColor32 Werte (Graphics32) findest du hier: ![]() (den Alpha Parameter des TColor32 Wertes kannst du dir schenken, nur benutze ich überall Graphics32 - sollte aber recht einfach zu modifizieren sein) Schau dir dort die Funktionen RGBToHSL und HSLToRGB an. Du wandelst dann deinen RGB Wert einfach in HSL um, erhöhst den Lightness Parameter um den entsprechenden Wert und wandelst es wieder in RGB um. |
Re: Farbhelligkeit verändern...
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:
Stahli
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; EDIT: Alle Maximalwerte 255 mussten natürlich in 240 geändert werden, da der Helligkeitsbereich 0..240 ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz