Und täglich grüßt das Murmeltier
http://www.FrankNStein.de/Smiley-Wolke.gif,
Zitat von
Hansa (per PN):
Hi,
tja so ist das eben. Man lebt nur zweimal.
Allerdings ist da noch ein Haken in meinem Labor 8) :
Delphi-Quellcode:
Unit farb1;
Interface
Uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
ExtCtrls;
Type TForm1 =
Class(TForm)
Memo1: TMemo;
Timer1: TTimer;
Procedure dunkler;
Procedure heller;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
i: integer;
dunkelmodus: boolean;
End;
Var Form1: TForm1;
Implementation
{$R *.dfm}
Procedure TForm1.dunkler;
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 + (R * HD
div 100);
G := G + (G * HD
div 100);
B := B + (B * HD
div 100);
Color :=
RGB(R, G, B);
memo1.lines.add('
dunkler '+IntToStr (g));
End;
Procedure TForm1.heller;
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;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
(*
dunkelmodus := (i mod 10) < 5;
*)
if not dunkelmodus
then
(*
heller
*)
else begin
dunkler;
heller;
end;
dunkelmodus :=
not dunkelmodus;
i := i + 1;
if i > 300000
then begin
Timer1.Enabled := false;
heller;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
i := 0;
dunkelmodus := true;
end;
End.
Ich habe die Buttons entfernt und lasse das ganze timergesteuert laufen. Ich mache alles heller oder dunkler, aber mit der Zeit wird alles immer dunkler.
Das sich der Wert bei einer häufigen Änderung einem mittleren Grau annähert ist schon richtig so, das ergiebt sich aus der rechenweises der Prozedur.
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:
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%
Wenn die Farbe also öfters geändert werden soll, ist es besser immer wieder von der Originalfarbe aus zu rechnen:
Delphi-Quellcode:
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;
z.B.:
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.FrankNStein.de/Smiley-Kuss.gif * *
http://www.FrankNStein.de/Smiley-Spinne.gif * * *
http://www.FrankNStein.de/Smiley-Winken.gif