AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RGB-Farben ändern ?

Ein Thema von Hansa · begonnen am 24. Nov 2003 · letzter Beitrag vom 25. Nov 2003
Antwort Antwort
Seite 2 von 2     12   
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#11

Re: RGB-Farben ändern ?

  Alt 25. Nov 2003, 13:02
Die zweite Prozedur muß aussehen, wie die erste:

Delphi-Quellcode:
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;
Und das bedeutet, man braucht eigentlich nur eine ! Das ganze kann dann einfach über den Wert von HD gesteuert werden.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#12

Re: RGB-Farben ändern ?

  Alt 25. Nov 2003, 13:10
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: http://www.delphipraxis.net/internal...?p=70103#70103

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#13

Re: RGB-Farben ändern ?

  Alt 25. Nov 2003, 14:28
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:
Procedure TForm1.Button1Click(Sender: TObject);
  Begin
    (* 10% heller *)
    HDAnpassen(10);
  End;

Procedure TForm1.Button2Click(Sender: TObject);
  Begin
    (* 10% dunkler *)
    HDAnpassen(-10);
  End;

http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

Re: RGB-Farben ändern ?

  Alt 25. Nov 2003, 19:54
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
Angehängte Dateien
Dateityp: zip farb.zip (1,5 KB, 23x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#15

Re: RGB-Farben ändern ?

  Alt 25. Nov 2003, 19:59
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:
{ Given a color and a luminance change "n" this routine returns a color whose
luminace has been changed accordingly. }

function ColorAdjustLuma(clrRGB: TColorRef; n: Integer; fScale: BOOL): TColorRef;
so als kleines sinnloses Beispiel
Delphi-Quellcode:
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;
mußt du mal n bischen rumprobieren

Mfg Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz