как получить противоположный цвет любого фонового изображения - PullRequest
12 голосов
/ 13 декабря 2010

как автоматически получить нужный цвет в зависимости от фона? если его темное фоновое изображение, это автоматически изменит цвет шрифта на более яркие цвета. было ли это возможно? есть идеи?

Ответы [ 4 ]

24 голосов
/ 13 декабря 2010

Ответ Дэвида, как правило, работает очень хорошо.Но есть несколько вариантов, и я упомяну некоторые из них.Во-первых, самый наивный подход - сделать

function InvertColor(const Color: TColor): TColor;
begin
    result := TColor(Windows.RGB(255 - GetRValue(Color),
                                 255 - GetGValue(Color),
                                 255 - GetBValue(Color)));
end;

, но это страдает от проблемы # 808080 (почему?).Очень хорошим решением является решение Дэвида, но оно выглядит очень плохо для некоторых неудачных цветов фона.Хотя текст, безусловно, виден, он выглядит ужасно.Один из таких «неудачных» цветов фона - # 008080.

Обычно я предпочитаю, чтобы текст был черным, если фон «светлый», и белым, если фон «темный».Поэтому я делаю

function InvertColor(const Color: TColor): TColor;
begin
  if (GetRValue(Color) + GetGValue(Color) + GetBValue(Color)) > 384 then
    result := clBlack
  else
    result := clWhite;
end;

Кроме того, если вы используете Delphi 2009+ и ориентированы на Windows Vista +, вас может заинтересовать параметр GlowSize в TLabel.

.
11 голосов
/ 13 декабря 2010

Я использую следующее, чтобы дать мне цвет, который контрастирует с указанным цветом:

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;
1 голос
/ 04 января 2014

Я пытаюсь вычислить контраст на основе "линейной" цветовой схемы, но это не очень хорошо для значений ввода розового и голубого цвета.Гораздо лучше это рассчитать по формуле RGB:

brightness = sqrt( .241 * R^2 + .691 * G^2 + .068 * B^2 ) 

В Delphi я создаю эту подпрограмму:

function GetContrastingColor(Color: TColor): TColor;
var r,g,b:double;i:integer;
begin
Color := ColorToRGB(Color);
r:=GetRValue(Color) ;
g:=GetGValue(Color) ;
b:=GetBValue(Color) ;
i:=round( Sqrt(
      r * r * 0.241 +
      g * g * 0.691 +
      b * b * 0.068));
if (i > 128) then   // treshold seems good in wide range
  Result := clBlack
else
  Result := clWhite;
end;
0 голосов
/ 29 июня 2013

У меня были проблемы с D6, когда TColor было clWindow.Я обнаружил, что если бы я не запустил ColorToRGB(Color), GetXValue(Color), то значение R, G, B clWindow будет равно 5,0,0 соответственно.Это почти черный цвет, в то время как clWindow было определено как 255,255,255 в моей тестовой среде.Кажется, это проблема только для значений, отправляемых с использованием константы, если я отправляю в эквивалентах в шестнадцатеричном или int-виде, все работает нормально.

...