2009-09-29 15 views
9

Tengo un 60% de forma opaca. Y cuando el usuario cambia el color del formulario, a veces (dependiendo del color elegido) ya no puede ver el texto en el formulario porque se parece mucho al color del formulario. Por lo tanto, estoy tratando de hacer un if/switch para ver si el BackColor elegido de la forma es Dark o Light. Si es oscuro, todo el texto en el formulario debe ser blanco. Si es Light, todo el texto en el formulario debe ser negro.Si el formulario es oscuro, el texto en el formulario debe ser Light

¿Es esto posible? Lo he visto por todos lados, pero no estoy seguro de qué buscar sin escribir toda la pregunta en el campo de búsqueda.

Cualquier ayuda/sugerencia sería muy apreciada.

Gracias, jason.

+0

hay otra solución [aquí] (http://stackoverflow.com/a/2509596/779408) – breceivemail

Respuesta

7

se puede comprobar, si la suma de los tres valores RGB están por encima de la mitad del máximo valor

-> porque 255255255 == blanca (luz) y 0,0,0 negro == (oscuro) :

fe

R 255 
G 140 
B 170 
===== 
    565 

Max: 765 (Oriente 382) Suma: 565

Debido a que la suma es 565 y por encima de la media (oscuro luz), el color es luz. Entonces puedes cambiar el texto a oscuro.

+0

Gracias @Lichtamberg, originalmente estaba pensando en esto, pero luego me las arreglé para convencerme de que no funcionaría. Pero lo hace, muy apreciado. –

+1

Eso haría que el amarillo oscuro sea como es (255, 255, 0). –

+0

tienes razón ... – Lichtamberg

18

¿Qué le parece usar Color.GetBrightness() para averiguar qué tan ligero es?

+0

Gracias @ Jon . Muy apreciado. :) –

3

Este método comprueba si el contraste de dos colores se puede leer:

public static bool ContrastReadableIs(Color color_1, Color color_2) 
{ 
    // Maximum contrast would be a value of "1.0f" which is the brightness 
    // difference between "Color.Black" and "Color.White" 
    float minContrast = 0.5f; 

    float brightness_1 = color_1.GetBrightness(); 
    float brightness_2 = color_2.GetBrightness(); 

    // Contrast readable? 
    return (Math.Abs(brightness_1 - brightness_2) >= minContrast); 
} 

Tener un color de fondo en busca de un color de primer plano se puede leer?
Here es un enfoque simple y bastante bueno para invertir el color de fondo.
NB: Esta invertación no significa que el color y el color invertido difieran en el brillo, pero si dos colores difieren en brillo al menos 0.5, generalmente muestran un contraste legible.

Button with text "Am I readable?"

Código de ensayo para controlador de clic el botón 1

Random r = new Random(); 

while (1 < 2) 
{ 
    // Get a random fore- and backcolor 
    Color foreColor = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), r.Next(0, 256)); 
    Color backColor = Color.FromArgb(r.Next(0, 256), r.Next(0, 256), r.Next(0, 256)); 

    // Contrast readable? 
    if (ContrastReadableIs(foreColor, backColor)) 
    { 
     button1.ForeColor = foreColor; 
     button1.BackColor = backColor; 
     System.Media.SystemSounds.Beep.Play(); 
     break; 
    } 
} 
Cuestiones relacionadas