No sé mucho sobre la composición del color, así que se me ocurrió este algoritmo que seleccionará un color de fondo basado en el color de la fuente en una prueba y errores base:Cómo elegir un color de fondo según el color de la fuente para tener el contraste adecuado
public class BackgroundFromForegroundColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is Color))
return value;
Color color = (Color)value;
if (color.R + color.G + color.B > 550)
return new SolidColorBrush(Colors.Gray);
else if (color.R + color.G + color.B > 400)
return new SolidColorBrush(Colors.LightGray);
else
return new SolidColorBrush(Colors.White);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
me hizo un poco de google sobre esto, pero no he encontrado nada muy formal acerca de las diferentes formas en que un color de fondo se puede calcular para obtener un buen efecto de contraste con el color de la fuente.
Así que mi pregunta es: ¿hay un enfoque más "formal" para elegir un buen fondo para obtener un buen contraste? Alternativamente, ¿cómo manejarías elegir un color de fondo con la única intención de que tu texto sea lo más legible posible sin importar el color de la fuente?
rápida actualización
Un poco más de contexto: Estoy simplemente tratando de mostrar una vista previa de un texto (por ejemplo, "El rápido zorro marrón salta sobre el perro perezoso") donde el usuario elige el color de la fuente , peso, fuente, etc. Sin embargo, estoy interesado en ver qué se puede hacer, ya sea súper simple o más complejo.
edición final
decidí a ir con lo que sugirió H.B.
: parece que funciona bien con todos los colores que probé a diferencia de mi anterior algoritmo fueron el primer plano no siempre adecuadamente contrastaría con el fondo. Hubiera tenido curiosidad de ver si hay una fórmula que te brinde un fondo "óptimo" para un primer plano dado, pero para lo que necesito en blanco y negro funciona bien. Este es mi código en su forma actual:
public class BackgroundFromForegroundColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is Color))
return value;
Color color = (Color)value;
double Y = 0.2126 * color.ScR + 0.7152 * color.ScG + 0.0722 * color.ScB;
return Y > 0.4 ? Brushes.Black : Brushes.White;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
Motivo similar cubierto aquí: [Hacer foregroundcolor en negro o blanco dependiendo del fondo] (http://stackoverflow.com/questions/2241447/make-foregroundcolor-black-or-white-depending-on-background), [Bueno color de primer plano de texto para un color de fondo dado] (http://stackoverflow.com/questions/946544/good-text-foreground-color-for-a-given-background-color) y [¿Cuáles son sus métodos de extensión favoritos para C# ?] (http://stackoverflow.com/questions/271398/what-are-your-favorite-extension-methods-for-c-codeplex-com-extensionoverflow/6031710#6031710) – takrl
Como nota al margen, el 'ConvertBack 'en una forma, los convertidores deberían lanzar una' NotSupportedException' ya que no habrá implementación. –