55 Stimmen

Delphi/Lazarus: Lesbare Schriftfarbe für beliebige Hintergrund-Farbe

Tipp von Stefan Trost | Letztes Update am 27.01.2023 | Erstellt am 02.11.2015

Wie wählt man eine geeignete Farbe für die Schrift aus, wenn der Hintergrund eine beliebige Farbe annehmen kann? Kürzlich habe ich mir diese Frage gestellt als ich einen eigenen Farbdialog programmiert habe.

Bei diesem Dialog wollte ich den Wert der Farbe stets auf der Farbe anzeigen und der Farbwert sollte natürlich stets lesbar bleiben, egal welche Hintergrundfarbe gewählt wurde. Programmiert habe ich dafür die folgende Funktion.

function GetContrastColorBlackOrWhite(const AColor: TColor): TColor;
var
  R, G, B: single;
begin
  R := GetRValue(AColor) * 0.25;
  G := GetGValue(AColor) * 0.625;
  B := GetBValue(AColor) * 0.125;

  if (R + G + B) > 128 then begin
    result := clBlack;
  end else begin
    result := clWhite;
  end; 
 
end;   

Dieser Funktion kann man nun eine beliebige Farbe übergeben und man bekommt entweder schwarz oder weiß zurückgegeben, je nachdem welche dieser beiden Farben als Hintergrundfarbe oder Vordergrundfarbe besser passt.

Wenn wir dieser Funktion beispielsweise die Farbe Weiß übergeben, erhalten wir Schwarz als geeignete Schriftfarbe vor weißem Hintergrund. Wenn wir dieser Funktion dagegen die Farbe Schwarz übergeben, erhalten wir als geeignete Schriftfarbe Weiß. Natürlich funktioniert die Funktion nicht nur für diese Extremfälle, sondern auch für Grauwerte oder Töne aller anderen Farben. Für Gelb oder ein helles Rot, Grün oder Blau sowie hellere Grautöne erhalten wir die Schriftfarbe Schwarz, während dunklere Grautöne oder ein dunkles Rot, Grün oder Blau die Schriftfarbe Weiß zurückgibt.

Anwendungsbeispiel

Natürlich möchten wir uns auch ein kleines Anwendungsbeispiel ansehen. In dem folgenden Code setzen wir die Hintergrundfarbe eines Edit-Feldes auf schwarz und rufen die Funktion auf, um eine geeignete Schriftfarbe zu erhalten, die sich trotz des schwarzen Hintergrundes lesen lässt. Die Funktion wird uns die Farbe Weiß liefern.

Edit1.Color      := clBlack;
Edit1.Font.Color := GetContrastColorBlackOrWhite(clBlack);

Der Trick der Funktion ist, alle Farbwerte mit einem Faktor zur Gewichtung auf zu addieren und anschließend zu vergleichen, ob dieser Wert über oder unter 128 liegt. Natürlich kann man diese Grenze auch nach oben oder nach unten korrigieren, je nachdem wie schnell man den Sprung zwischen Weiß und Schwarz haben möchte.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.