2012-01-05 12 views
6

Powiel możliwe:
given a background color, how to get a foreground color that make it readable on that background color?Automatycznie określić optymalną fontcolor przez backgroundColor

Zastanawiam się czy jest jakiś algorytm do określenia optymalnego fontcolor dla czytelności poprzez jego kolor tła.

Na przykład: Tworzę ikonę z dynamicznym tekstem i kolorem. Jeśli kolor jest trochę ciemny, chcę ustawić kolor czcionki na biały, a jeśli jest dość jasny, chcę, aby był czarny (a może nawet szarawy).

public DynamicIcon(String iconText, Color backgroundColor) 
    { 
    this.iconText = iconText; 
    this.backgroundColor = backgroundColor; 

    this.fontColor = determineFontColor(backgroundColor); 
    } 

    //This is what I need (Pseudocode): 
    private fontColor determineFontColor(Color backgroundColor) 
    { 
    if(backgroundColor == bright) 
     return Color.BLACK; 
    if(backgroundColor == dark) 
     return Color.WHITE; 
    //If possible: 
    if(backgroundColor == somethingInBetween) 
     return Color.GRAYISH; 
    } 

Niestety nie znalazłem żadnego algorytmu takiego, mimo iż jestem dosyć pewny, że już istnieje. Ktoś ma jakieś pomysły?

Dzięki, ymene

Odpowiedz

1

Musieliśmy zrobić coś takiego w naszym systemie: oparta na tle, możemy pokolorować czcionki czarny lub biały. Rozwiązanie, które znaleźliśmy, nie jest doskonałe i wybiera niewłaściwy kolor w niektórych rzadkich okazjach, ale jesteśmy z niego bardzo zadowoleni.

To co zrobiliśmy:

int red = 0; 
int green = 0; 
int blue = 0; 

if (backgroundColor.red + backgroundColor.green + backgroundColor.blue < 383) { 
    red = 255; 
    green = 255; 
    blue = 255; 
} 

A potem używamy red, green i blue wartości, aby utworzyć nowy Color obiekt.

Magiczna liczba 383 jest wynikiem (255 + 255 + 255)/2

+1

dziękuję za podzielenie się pomysłem. Spróbuję tego. Może i wystarczająco dobrze dla mnie. – crusam

+0

rgb (198, 217, 188) jest dość ciemno fioletowym użytkiem OSX dla koloru tła listy wyboru (używają białego dla koloru pierwszego planu tekstu.) 191 + 87 + 218 = 496, więc ten algorytm określiłby to jako "lekkie" . Inne rozwiązanie, które miałem, które miało zostać przekonwertowane na HSB, a następnie wykorzystałem wartość B jako wartość graniczną, nie powiodło się w tym samym przykładzie. – Trejkaz

Powiązane problemy