![]() |
Re: farbverlauf in %
Dann sieh Dir dies mal an:
![]() |
Re: farbverlauf in %
wenn du unbedingt über 3 Farben gehen willst, dann mußt du die Berechnung teilen
0%-50% Farbe1 > Farbe2 50-100% Farbe2 > Farbe2 aber Rot + Grün ergibt doch Gelb. also sollte der Farbverlauf von Rot nach Grün auch über Gelb gehen? (es sei denn ich hab mich verrechnet) OK, 50% Rot + 50% Grün = 50% Gelb = dunkelgelb
Delphi-Quellcode:
Farbe = RGB(255 * Min(Prozent, 50) div 50, 255 * Min(100 - Prozent, 50) div 50, 0);
Delphi-Quellcode:
aber wie gesagt, alles nur ein bissl Mathematik ... hätt man sich auch selbst ausrechen können, bzw. selbst die passenden Formeln erstellen können
// eine Form mit Memo1:TMemo und Image1:TImage (.Stretch=true)
Procedure TForm1.FormCreate(Sender: TObject); Var Prozent: Integer; Begin Image1.Picture.Bitmap.Width := 101; Image1.Picture.Bitmap.Height := 8; // jede Farbe gleichmäßig über den gesamten Bereich verteilt For Prozent := 0 to 100 do Begin Memo1.Lines.Add(Format('%d R:%d G:%d F1:$%.8x F2:$%.8x', [Prozent, {red}255 * Prozent div 100, {grün}255 * (100 - Prozent) div 100, {red}(255 * Prozent div 100) or {grün}(255 * (100 - Prozent) div 100 * $0100), RGB(255 * Prozent div 100, 255 * (100 - Prozent) div 100, 0)])); Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 0] := RGB(255 * Prozent div 100, 255 * (100 - Prozent) div 100, 0); End; Memo1.Lines.Add(''); // jede Farbe nur über den halben Bereich verteilt For Prozent := 0 to 100 do If Prozent <= 50 Then Begin Memo1.Lines.Add(Format('%d R:%d G:%d F1:$%.8x F2:$%.8x', [Prozent, {red}255 * Prozent div 50, {grün}255, {red}(255 * Prozent div 50) or {grün}(255 * $0100), RGB(255 * Prozent div 50, 255, 0)])); Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 3] := RGB(255 * Prozent div 50, 255, 0); End Else Begin Memo1.Lines.Add(Format('%d R:%d G:%d F1:$%.8x F2:$%.8x', [Prozent, {red}255, {grün}255 * (100 - Prozent) div 50, {red}(255) or {grün}(255 * (100 - Prozent) div 50 * $0100), RGB(255, 255 * (100 - Prozent) div 50, 0)])); Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 3] := RGB(255, 255 * (100 - Prozent) div 50, 0); End; Memo1.Lines.Add(''); // jede Farbe nur über den halben Bereich verteilt - zusammengefaßt For Prozent := 0 to 100 do Begin Memo1.Lines.Add(Format('%d R:%d G:%d F1:$%.8x F2:$%.8x', [Prozent, {red}255 * Min(Prozent, 50) div 50, {grün}255 * Min(100 - Prozent, 50) div 50, {red}(255 * Min(Prozent, 50) div 50) or {grün}(255 * Min(100 - Prozent, 50) div 50 * $0100), RGB(255 * Min(Prozent, 50) div 50, 255 * Min(100 - Prozent, 50) div 50, 0)])); Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 6] := RGB(255 * Min(Prozent, 50) div 50, 255 * Min(100 - Prozent, 50) div 50, 0); End; For Prozent := 0 to 100 do Begin Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 1] := Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 0]; Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 2] := Self.Color; Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 4] := Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 3]; Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 5] := Self.Color; Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 7] := Image1.Picture.Bitmap.Canvas.Pixels[Prozent, 6]; End; End; (* object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 505 ClientWidth = 337 OnCreate = FormCreate object Image1: TImage Left = 8 Top = 424 Width = 321 Height = 73 Anchors = [akRight, akBottom] Stretch = True end object Memo1: TMemo Left = 8 Top = 8 Width = 321 Height = 410 Anchors = [akLeft, akTop, akRight, akBottom] ScrollBars = ssBoth end end *) |
Re: farbverlauf in %
Liste der Anhänge anzeigen (Anzahl: 1)
Joa danke, genau das wars was ich brauchte...
Danke.. Umgewandelt noch in eine Funktion (Math in Uses aufnehmen):
Delphi-Quellcode:
function GetColor(Prozent: integer): COLORREF;
begin Result := RGB(255 * Min(100 - Prozent, 50) div 50, 255 * Min(Prozent, 50) div 50, 0); end; |
Re: farbverlauf in %
Delphi-Quellcode:
function Gradient( ACanvas: TCanvas;
Pos: TRect; const FromColor, ToColor: Cardinal ): Boolean; var x: Integer; NewColor: Cardinal; Percent: Single; rOP, gOP, bOP: Single; // One Percent begin Result := False; {Initialization} Pos.Right := Pos.Right - Pos.Left; // Right = Width Pos.Bottom := Pos.Bottom - Pos.Top; // Bottom = Height with ACanvas do begin rOP := (GetRValue(ToColor)-GetRValue(FromColor)) / Pos.Right; gOP := (GetGValue(ToColor)-GetGValue(FromColor)) / Pos.Right; bOP := (GetBValue(ToColor)-GetBValue(FromColor)) / Pos.Right; for x := 1 to Pos.Right do begin NewColor := RGB( GetRValue(FromColor)+Round(rOP*x), GetGValue(FromColor)+Round(gOP*x), GetBValue(FromColor)+Round(bOP*x) ); Pen.Color := NewColor; MoveTo( Pos.Left+x, Pos.Top ); LineTo( Pos.Left+x, Pos.Top+Pos.Bottom ); end; end; Result := not Result; end; |
Re: farbverlauf in %
@mr_emre_d: Zieh verfehlt, es sei denn du hast noch soeinene Funktion mit 3 Parametern.
(die Berechnung darin entspricht meiner ersten "falschen/ungewünschten" Formel)
Code:
und wieso Cardinal? (TColor)
[b]Function[/b] Gradient(ACanvas: TCanvas; Pos: TRect; const FromColor, [b]ThroughColor[/b], ToColor: TColor): Boolean;
... Gradient(Canvas, Pos, clGreen, [b]clYellow[/b], clLime); |
Re: farbverlauf in %
TColor = Cardinal
bzw TColor = 4 unsigned Bytes Und ja, die habe ich :P (pfeile grad noch rum, kann sie aber demnächst posten) |
Re: farbverlauf in %
Zitat:
Zitat:
PS: TColor ist nicht Cardinal (ein Glück, daß die Meißten die Bereichprüfung nicht aktiv haben)
Delphi-Quellcode:
TColor = -$7FFFFFFF-1..$7FFFFFFF;
|
Re: farbverlauf in %
uupps .. :oops:
dann eben integer bzw signed 4 bytes :P Edit: Da hastes Himitsu:
Delphi-Quellcode:
function _inc(var x: Integer): Integer;
begin Result := x; inc(x); end; function Gradient2( ACanvas: TCanvas; Pos: TRect; const Colors: Array of Integer ): Boolean; var x: Integer; NewColor: Integer; Percent: Single; rOP, gOP, bOP: Single; // One Percent cOldID, cID: Integer; xPercent, OnePercent: Cardinal; begin Result := False; {Initialization} Pos.Right := Pos.Right - Pos.Left; // Right = Width Pos.Bottom := Pos.Bottom - Pos.Top; // Bottom = Height with ACanvas do begin cOldID := -1; cID := 0; xPercent := High(Colors); if xPercent < 1 then Exit; OnePercent := Pos.Right div xPercent; for x := 1 to Pos.Right do begin if x-OnePercent >= OnePercent*cOLDID then begin cOldID := _inc(cID); rOP := (GetRValue(Colors[cID])-GetRValue(Colors[cOldID])) / OnePercent; gOP := (GetGValue(Colors[cID])-GetGValue(Colors[cOldID])) / OnePercent; bOP := (GetBValue(Colors[cID])-GetBValue(Colors[cOldID])) / OnePercent; end; NewColor := RGB( GetRValue(Colors[cOldID])+Round(rOP*(x mod OnePercent)), GetGValue(Colors[cOldID])+Round(gOP*(x mod OnePercent)), GetBValue(Colors[cOldID])+Round(bOP*(x mod OnePercent)) ); Pen.Color := NewColor; MoveTo( Pos.Left+x, Pos.Top ); LineTo( Pos.Left+x, Pos.Top+Pos.Bottom ); end; end; Result := not Result; end; |
Re: farbverlauf in %
Man könnte das ganze mit Scanline und co machen aber dazu hab ich grad keine Lust :P
|
Re: farbverlauf in %
Zitat:
Ganz besonders die 2. Funktion:
Delphi-Quellcode:
Mit dieser Funktion kannst du die schönsten Farbverläufe berechnen.
// Farbe zwischen beliebig vielen vorgegebenen Farbwerten berechnen
function ColorsBetween(colors:array of TColor; blend:Real):TColor; Wenn du z.B. Rot nach Gelb zu Grün haben willst, dann wäre der Aufruf:
Delphi-Quellcode:
Ein Farbübergang zwischen Rot und Grün ohne Farbmischung erreicht man z.B. indem man Grau als mittlere Farbe einsetzt:
farbe := ColorsBetween([clRed, clYellow, clGreen], blendfaktor);
Delphi-Quellcode:
Ausserdem:
farbe := ColorsBetween([clRed, clGrey, Green], blendfaktor);
Also ich halte es für wichtig, dass man das Berechnen des Farbverlauf strikt vom Zeichen trennt. Nur so kann man wirklich alle Möglichkeiten des Einfärben ausschöpfen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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-2025 by Thomas Breitkreuz