![]() |
Re: RGB-Farben ändern ?
Die zweite Prozedur muß aussehen, wie die erste:
Delphi-Quellcode:
Und das bedeutet, man braucht eigentlich nur eine ! Das ganze kann dann einfach über den Wert von HD gesteuert werden.
Procedure TForm1.Button2click;
Var R, G, B: Byte; Farbe: TColor; HD: ShortInt; { -100..0 = dunkler / 0..100 = heller } Begin HD := 10; Farbe := ColorToRGB(Color); R := (Farbe and $000000FF); G := (Farbe and $0000FF00) shr 8; B := (Farbe and $00FF0000) shr 16; (* R := R + ((255 - R) * HD div 100); G := G + ((255 - G) * HD div 100); B := B + ((255 - B) * HD div 100); *) R := R + (R * HD div 100); G := G + (G * HD div 100); B := B + (B * HD div 100); Color := RGB(R, G, B); memo1.lines.add('***** heller ***** '+IntToStr (g)); End; |
Re: RGB-Farben ändern ?
Um eine farbtreue Veränderung zu erreichen, musst Du mit HSV/HSL/HSB arbeiten. Die RGB-Farbe muss dabei entsprechend in eines der Schemate umgewandelt werden. Bei HSB kannst Du dann die Brightness (B-Value) verändern und den wieder zurückverwandeln. Siehe auch:
![]() ...:cat:... |
Re: RGB-Farben ändern ?
Meintest du das zum Beispiel so?
Delphi-Quellcode:
Uses Math;
Procedure HDAnpassen(HD: ShortInt); { HD: -100..0 = dunkler / 0..100 = heller } Var Farbe: TColor; R, G, B: Byte; Begin Farbe := ColorToRGB(Form1.Color); R := (Farbe and $000000FF); G := (Farbe and $0000FF00) shr 8; B := (Farbe and $00FF0000) shr 16; If HD < 0 Then Begin R := Trunc(R + (R * HD / 100)); G := Trunc(G + (G * HD / 100)); B := Trunc(B + (B * HD / 100)); {Form1.Memo1.Lines.Add('***** dunkler ***** ' + IntToStr(R));} Form1.Memo1.Lines.Add('***** dunkler ***** ' + IntToStr(R) + ':' + IntToStr(G) + ':' + IntToStr(B)); End Else Begin R := Ceil(R + ((255 - R) * HD / 100)); G := Ceil(G + ((255 - G) * HD / 100)); B := Ceil(B + ((255 - B) * HD / 100)); {Form1.Memo1.Lines.Add('***** heller ***** ' + IntToStr(R));} Form1.Memo1.Lines.Add('***** heller ***** ' + IntToStr(R) + ':' + IntToStr(G) + ':' + IntToStr(B)); End; Form1.Color := RGB(R, G, B); End;
Delphi-Quellcode:
http://www.delphipraxis.net/images/common/divider.jpg
Procedure TForm1.Button1Click(Sender: TObject);
Begin (* 10% heller *) HDAnpassen(10); End; Procedure TForm1.Button2Click(Sender: TObject); Begin (* 10% dunkler *) HDAnpassen(-10); End; ![]() ![]() ![]() |
Re: RGB-Farben ändern ?
Liste der Anhänge anzeigen (Anzahl: 1)
Und täglich grüßt das Murmeltier
![]() Zitat:
Nehmen wir mal einen Farbeanteil (z.B. Rot) heraus. Da die Prozente immer vom aktuellen Farbwert zum Ende/Anfang der Scala hin gerechnet werden, ergeben +50% nicht die gleiche Änderung wie -50%.
Code:
Wenn die Farbe also öfters geändert werden soll, ist es besser immer wieder von der Originalfarbe aus zu rechnen:
dunkel hell
***** ***** ***** ***** ***** ***** ***** ***** ***** ***** 2 X 1 a b X = aktuelle Farbe 1 = +50% a = erst +50% und danach -50% 2 = -50% b = erst -50% und danach +50%
Delphi-Quellcode:
z.B.:
Function TForm1.FarbHelligkeit(Farbe: TColor; HD: ShortInt): TColor;
{ HD: -100..0 = dunkler / 0..100 = heller } Var R, G, B: Byte; Begin Farbe := ColorToRGB(Farbe); R := (Farbe and $000000FF); G := (Farbe and $0000FF00) shr 8; B := (Farbe and $00FF0000) shr 16; If HD < 0 Then Begin R := Trunc(R + (R * HD / 100)); G := Trunc(G + (G * HD / 100)); B := Trunc(B + (B * HD / 100)); {Form1.Memo1.Lines.Add('***** dunkler ***** ' + IntToStr(R));} Form1.Memo1.Lines.Add('***** dunkler ***** ' + IntToStr(R) + ':' + IntToStr(G) + ':' + IntToStr(B)); End Else Begin R := Ceil(R + ((255 - R) * HD / 100)); G := Ceil(G + ((255 - G) * HD / 100)); B := Ceil(B + ((255 - B) * HD / 100)); {Form1.Memo1.Lines.Add('***** heller ***** ' + IntToStr(R));} Form1.Memo1.Lines.Add('***** heller ***** ' + IntToStr(R) + ':' + IntToStr(G) + ':' + IntToStr(B)); End; Result := RGB(R, G, B); End;
Delphi-Quellcode:
Color := FarbHelligkeit(clBtnFace, i);
In der geänderten Demo ist zu sehen, dass sich die Farbe etwas unsymetrisch ändert, was sich ja wieder aus der rechenweise ergiebt. Das kann man aber änderen, in dem man eine andere Farbe nimmt (z.B. &7F7F7F), diese ist ja in der Mitte und es entsteht eine symetrische Änderung, oder den Änderungsbereich abändert (z.B. -10% bis +100% - das sieht zumindestens bei mir gut aus). z.B.: -10% bis +100% => (-10%, -8%, -6%, -4%, -2%, 0%, +20%, +40%, +60%, +80%, +100%) Das ergibt einen symetrischeren übergang. http://www.delphipraxis.net/images/common/divider.jpg ![]() ![]() ![]() |
Re: RGB-Farben ändern ?
Hallo
die ganze Sache geht recht einfach, Delphi unterstützt HLS in einer Graphutil unit, die steht nicht in der Hilfe und für Leute ohne Source sieht es schlecht aus. da gibts ein paar umrechnungsfunktioen und dann die hier: Zitat:
Delphi-Quellcode:
mußt du mal n bischen rumprobieren
procedure TForm1.Button1Click(Sender: TObject);
Var i:integer; col:TColor; begin col := rgb(255,100,50); for i:=-10 to 10 do begin Shape1.Brush.Color := ColorAdjustLuma(col,i*5,false); Application.ProcessMessages; sleep(50); end; end; Mfg Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 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