![]() |
RGB-Gegenteil-Farbe ermitteln
Hallo, gibt es eine Möglichkeit einen Farbwert ins Gegenteil zu verwandeln?
Beispiel: aus Input Farbe Schwarz wird Output Farbe weiß. Zur Zeit nutze ich das hier: (nicht von mir, aus CodeLib)
Delphi-Quellcode:
Aber das ermittelt nur ob Input zu Hell oder Dunkel gehört, ich würde das gerne etwas professioneller haben wollen so das nur ein Wert dabei ausgespuckt wird aber habe keine Ahnung wie.
procedure EdBackColor(FontC: TColor; var EditableColor,
ReadOnlyColor: TColor); // Calculate the luminance of the color using the simplified formula // luminance = 0.25*red + 0.625*green + 0.125*blue // If greater than 0.5, use a dark background var R, G, B: Integer; begin R := GetRValue(FontC) * 2; G := GetGValue(FontC) * 5; B := GetBValue(FontC); if R + G + B then begin EditableColor := clWhite; ReadOnlyColor := clSilver; end else begin EditableColor := clBlack; ReadOnlyColor := clDkGray; end; end; Mein Erster Gedanke wäre die R G B values einfach umdrehen, ist das der Richtige Weg? Beispiel:
Delphi-Quellcode:
function InvertColor(Input: TColor): TColor;
var R, G, B: Byte; begin R := 255 - GetRValue(Input); G := 255 - GetGValue(Input); B := 255 - GetBValue(Input); Result := RGB(R, G, B); end; |
AW: RGB-Gegenteil-Farbe ermitteln
Schwarz und Weiß sind nicht unbedingt günstige Beispiele wenn es um Farben geht. Falls ich es richtig verstanden habe (rot -> grün), geht es mit RGB nicht. Schau dir mal den
![]() ![]() ![]() |
AW: RGB-Gegenteil-Farbe ermitteln
Erreichen will ich so etwas in der Art:
Ich gebe eine Hintergrund-Farbe vor und erhalte dafür die Gegenteilige Vordergrund-Farbe. Schwarz -> Weiß / Vorder- -> Hintergrund; ist nur exemplarisch damit man versteht worauf ich hinaus möchte. Zitat:
|
AW: RGB-Gegenteil-Farbe ermitteln
Bisheriger Fortschritt der oftmals ganz gut klappt:
Delphi-Quellcode:
Total problematisch wird es bei sehr sehr dunklen bzw sehr sehr hellen Werten, da mache ich noch was falsch.
GraphUtil.ColorRGBToHLS( mmo1.Font.Color, Hue, Luminance, Saturation );
Hue := Hue + 180; mmo1.Color := GraphUtil.ColorHLSToRGB( Hue, Luminance, Saturation ); |
AW: RGB-Gegenteil-Farbe ermitteln
Wenn es Dir, so wie es scheint, eher darum geht, gut lesbaren Kontrast zu haben, dann schau mal hier:
![]() Ist zwar aus der JavaScript-Welt, aber leicht zu verstehen und entsprechend umzusetzen. ...:cat:... |
AW: RGB-Gegenteil-Farbe ermitteln
Du könntest noch etwas am Helligkeitswert schrauben. In etwa
Delphi-Quellcode:
oder so.
Luminance:=120 - Luminance div 2
|
AW: RGB-Gegenteil-Farbe ermitteln
Wir nutzen diese Funktion hier, um die Schriftfarbe entsprechend dem Hintergrund zu wählen (aber nur entweder schwarz oder weiß) - das funktioniert dann so wie in dem Artikel, den Sakura gelinkt hat.
Delphi-Quellcode:
function ContrastColor(AColor: TColor): TColor;
type TRGB = packed record R, G, B, X: Byte; end; var LColor: TRGB; LLuminance: Double; begin Integer(LColor) := AColor; // Counting the perceptive luminance - human eye favors green color... // see https://de.wikipedia.org/wiki/Luminanz LLuminance := (0.2126 * LColor.R + 0.7152 * LColor.G + 0.0722 * LColor.B) / 255; if LLuminance > 0.5 then Result := clBlack else Result := clWhite; // dark colors - white font end; |
AW: RGB-Gegenteil-Farbe ermitteln
Das gesuchte Wort ist Komplementärfarbe (complemetary color). Und damit findet man dann zB
![]() Sherlock |
AW: RGB-Gegenteil-Farbe ermitteln
Zitat:
Delphi-Quellcode:
Wenn Input sehr dunkel ist versagt es.
function Brightness(const Input: TColor): TColor;
begin Result := Round((GetRValue(Input) * 299 + GetGValue(Input) * 587 + GetBValue(Input) * 114) / 1000); end; Zitat:
Delphi-Quellcode:
Danke sehr, das ist bis jetzt die Beste Variante.
GraphUtil.ColorRGBToHLS( mmo1.Font.Color, Hue, Luminance, Saturation );
Hue := Hue + 180; Luminance:= 120 - Luminance div 2; mmo1.Color := GraphUtil.ColorHLSToRGB( Hue, Luminance, Saturation ); Zitat:
Zitat:
Delphi-Quellcode:
habe ich das hier probiert:
function InvertColor(const Input: TColor): TColor;
begin Result := RGB(255 - GetRValue(Input), 255 - GetGValue(Input), 255 - GetBValue(Input)); end;
Delphi-Quellcode:
Das ist so wie nur Min oder Max. Also nicht direkt das was ich wollte, vielleicht habe ich auf der Seite auch was überlesen.
function xorColor(BackgroundColor: TColor): TColor;
begin BackgroundColor := ColorToRGB(BackgroundColor); Result := RGB( IfThen(GetRValue(BackgroundColor)>$40, $00, $FF), IfThen(GetGValue(BackgroundColor)>$40, $00, $FF), IfThen(GetBValue(BackgroundColor)>$40, $00, $FF) ); end; Ydobons Vorschläge in welche Richtung ich mich bewegen sollte finde ich bis jetzt am besten da ich noch keine Farbe entdeckt habe wo sich Vorder-/Hintergrund dolle in die Quere kommt und nicht nur Schwarz/Weiß als Resultat definiert wird. |
AW: RGB-Gegenteil-Farbe ermitteln
Zitat:
Komplementärfarben können oft schwer zu lesen sein bzw. unangenehm für den Betrachter. Würde ich nicht zu raten. ...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 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