Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi RGB-Gegenteil-Farbe ermitteln (https://www.delphipraxis.net/197105-rgb-gegenteil-farbe-ermitteln.html)

KodeZwerg 17. Jul 2018 23:40

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:
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;
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.
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;

Ydobon 18. Jul 2018 04:34

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 HSV-Farbraum an. Dort kannst du dann die Farbwerte rotieren lassen. Delphi bietet dazu ColorRGBToHLS und ColorHLSToRGB an.

KodeZwerg 18. Jul 2018 04:49

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:

Zitat von Ydobon (Beitrag 1407600)
Schau dir mal den HSV-Farbraum an. Dort kannst du dann die Farbwerte rotieren lassen.

Dankeschön, das schaue ich mir näher an!

KodeZwerg 18. Jul 2018 05:50

AW: RGB-Gegenteil-Farbe ermitteln
 
Bisheriger Fortschritt der oftmals ganz gut klappt:
Delphi-Quellcode:
GraphUtil.ColorRGBToHLS( mmo1.Font.Color, Hue, Luminance, Saturation );
Hue := Hue + 180;
mmo1.Color := GraphUtil.ColorHLSToRGB( Hue, Luminance, Saturation );
Total problematisch wird es bei sehr sehr dunklen bzw sehr sehr hellen Werten, da mache ich noch was falsch.

sakura 18. Jul 2018 06:41

AW: RGB-Gegenteil-Farbe ermitteln
 
Wenn es Dir, so wie es scheint, eher darum geht, gut lesbaren Kontrast zu haben, dann schau mal hier: https://trendct.org/2016/01/22/how-t...th-background/

Ist zwar aus der JavaScript-Welt, aber leicht zu verstehen und entsprechend umzusetzen.

...:cat:...

Ydobon 18. Jul 2018 06:41

AW: RGB-Gegenteil-Farbe ermitteln
 
Du könntest noch etwas am Helligkeitswert schrauben. In etwa
Delphi-Quellcode:
Luminance:=120 - Luminance div 2
oder so.

Stevie 18. Jul 2018 09:05

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;

Sherlock 18. Jul 2018 09:39

AW: RGB-Gegenteil-Farbe ermitteln
 
Das gesuchte Wort ist Komplementärfarbe (complemetary color). Und damit findet man dann zB https://stackoverflow.com/questions/...kground-images

Sherlock

KodeZwerg 18. Jul 2018 12:20

AW: RGB-Gegenteil-Farbe ermitteln
 
Zitat:

Zitat von sakura (Beitrag 1407606)
Ist zwar aus der JavaScript-Welt, aber leicht zu verstehen und entsprechend umzusetzen.

Danke sehr, habe es so umgesetzt:
Delphi-Quellcode:
function Brightness(const Input: TColor): TColor;
begin
 Result := Round((GetRValue(Input) * 299 + GetGValue(Input) * 587 + GetBValue(Input) * 114) / 1000);
end;
Wenn Input sehr dunkel ist versagt es.
Zitat:

Zitat von Ydobon (Beitrag 1407607)
Du könntest noch etwas am Helligkeitswert schrauben.

Delphi-Quellcode:
GraphUtil.ColorRGBToHLS( mmo1.Font.Color, Hue, Luminance, Saturation );
Hue := Hue + 180;
Luminance:= 120 - Luminance div 2;
mmo1.Color := GraphUtil.ColorHLSToRGB( Hue, Luminance, Saturation );
Danke sehr, das ist bis jetzt die Beste Variante.
Zitat:

Zitat von Stevie (Beitrag 1407631)
aber nur entweder schwarz oder weiß

Genau so etwas hatte ich ja bereits und davon wollte ich weg, Danke trotzdem!
Zitat:

Zitat von Sherlock (Beitrag 1407637)
Das gesuchte Wort ist Komplementärfarbe (complemetary color).

Danke sehr für den Link, abgesehen davon das da auch InvertColor() angeboten wird in etwas kürzerer Form:
Delphi-Quellcode:
function InvertColor(const Input: TColor): TColor;
begin
  Result := RGB(255 - GetRValue(Input), 255 - GetGValue(Input), 255 - GetBValue(Input));
end;
habe ich das hier probiert:
Delphi-Quellcode:
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;
Das ist so wie nur Min oder Max. Also nicht direkt das was ich wollte, vielleicht habe ich auf der Seite auch was überlesen.



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.

sakura 18. Jul 2018 12:31

AW: RGB-Gegenteil-Farbe ermitteln
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407656)
Zitat:

Zitat von sakura (Beitrag 1407606)
Ist zwar aus der JavaScript-Welt, aber leicht zu verstehen und entsprechend umzusetzen.

Danke sehr, habe es so umgesetzt:
Delphi-Quellcode:
function Brightness(const Input: TColor): TColor;
begin
 Result := Round((GetRValue(Input) * 299 + GetGValue(Input) * 587 + GetBValue(Input) * 114) / 1000);
end;
Wenn Input sehr dunkel ist versagt es.

Die Funktion berechnet auch nur die Helligkeit des Wertes, basierend auf dieser wird dann die Overlay-Farbe ermitteln ($00333333 bzw $00FFFFFF).

Komplementärfarben können oft schwer zu lesen sein bzw. unangenehm für den Betrachter. Würde ich nicht zu raten.

...:cat:...

Stevie 18. Jul 2018 12:44

AW: RGB-Gegenteil-Farbe ermitteln
 
Zitat:

Zitat von sakura (Beitrag 1407662)
Komplementärfarben können oft schwer zu lesen sein bzw. unangenehm für den Betrachter. Würde ich nicht zu raten.

Absolut! Das führt zu so Augenkrebs wie in der DevExpress Progressbar, die magentafarbene Schrift auf grüner Progressbar zeichnet :wall:

KodeZwerg 18. Jul 2018 13:31

AW: RGB-Gegenteil-Farbe ermitteln
 
Ich möchte das im Endeffekt nicht für Text verwenden, das dient mir hier nur als Beispiel, sondern damit dynamisch die Farbe des Cursors setzen bzw ein Auswahl-Rechteck damit einfärben. Also Krebs-Faktor hält sich in Grenzen :-)

Frickler 18. Jul 2018 14:39

AW: RGB-Gegenteil-Farbe ermitteln
 
Wenns doch mal um Text gehen sollte, hier ein Link:

http://www.ergo-online.de/site.aspx?...gestaltung.htm

Ganz unten auf der Seite ist dann noch ein PDF-Download "Software-Gestaltung: Farbe auf dem Bildschirm".
Da geht es darum, welche Farbkombinationen Text/Hintergrund ergonomisch sind.

Hat mir schon öfter weiter geholfen.

KodeZwerg 18. Jul 2018 15:03

AW: RGB-Gegenteil-Farbe ermitteln
 
Zitat:

Zitat von Frickler (Beitrag 1407696)
Hat mir schon öfter weiter geholfen.

Dein Link ist Klasse, sehr gute Informationen auch für meine Zwecke sind mit dabei (Sättigungswert).
Durch den Link habe ich auch erfahren das eine Bildschirmarbeitsverordnung existiert.
Also alles in allem eine sehr coole Resource wenn es um Farben und Text-Darstellung geht, Dankeschön dafür!

Stevie 18. Jul 2018 15:07

AW: RGB-Gegenteil-Farbe ermitteln
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407681)
Ich möchte das im Endeffekt nicht für Text verwenden, das dient mir hier nur als Beispiel, sondern damit dynamisch die Farbe des Cursors setzen bzw ein Auswahl-Rechteck damit einfärben. Also Krebs-Faktor hält sich in Grenzen :-)

Aber auch dort bin ich der Meinung, dass schwarz oder weiß auf bunt besser ist als magenta auf grün oder gelb auf blau.

Namenloser 18. Jul 2018 18:08

AW: RGB-Gegenteil-Farbe ermitteln
 
Zitat:

Zitat von Stevie (Beitrag 1407669)
Zitat:

Zitat von sakura (Beitrag 1407662)
Komplementärfarben können oft schwer zu lesen sein bzw. unangenehm für den Betrachter. Würde ich nicht zu raten.

Absolut! Das führt zu so Augenkrebs wie in der DevExpress Progressbar, die magentafarbene Schrift auf grüner Progressbar zeichnet :wall:

Besonders schlimm ist es, wenn der Hintergrund 50%-Grau ist. Dann ist der Vordergrund unsichtbar.

KodeZwerg 19. Jul 2018 19:44

AW: RGB-Gegenteil-Farbe ermitteln
 
Danke nochmal, hat geholfen da ich nun etwas völlig anderes Erreichen möchte um dieser Krebs-Situation aus dem Weg zu gehen.
Es ist noch in der Mache, hier was ich Vorhabe, Danke an dieser Stelle nochmal für HLS und die Java Brightness, beides kombiniert soll das simple machen:
Ab brightness(da bin ich noch am Tüfteln was ein Guter Hell/Dunkel Wert ist) = Hell dann HLS verdunkeln ansonsten andersrum.
In der HLS über Saturation(plus oder minus) und Luminesence(plus oder minus) wirds heller oder dunkler. Hue bleibt wie es ist.
So kommt es mir fürs Auge meist angenehm vor. Für die eigentliche Input-Farbe kann ja meine Funktion nichts.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 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