2010-09-15 19 views
14

¿Hay alguna manera fácil de combinar dos valores de System.Drawing.Color? ¿O tengo que escribir mi propio método para tomar dos colores y combinarlos?¿Hay alguna manera fácil de combinar dos valores System.Drawing.Color?

Si lo hago, ¿cómo podría uno hacer eso?

+2

Combinarlos ¿cómo? Si mezclas pintura roja con pintura azul obtienes pintura púrpura, pero si miras una bola azul a través de un cristal rojo, la bola se ve negra, no morada. ¿Qué tipo de mezcla tenías en mente? –

+2

@Eric Lippert: Creo que era bastante claro para todos que se refería a la fusión alfa. Cualquier otro tipo de mezcla es mucho más raro y más especializado, por lo que lo habría mencionado explícitamente. – Timwi

+6

@Timwi: No estaba claro para mí, por lo que no estaba claro para todos. Quizás estaba claro para todos menos para mí. –

Respuesta

27

Escribí un método de utilidad para exactamente este propósito. :)

/// <summary>Blends the specified colors together.</summary> 
/// <param name="color">Color to blend onto the background color.</param> 
/// <param name="backColor">Color to blend the other color onto.</param> 
/// <param name="amount">How much of <paramref name="color"/> to keep, 
/// “on top of” <paramref name="backColor"/>.</param> 
/// <returns>The blended colors.</returns> 
public static Color Blend(this Color color, Color backColor, double amount) 
{ 
    byte r = (byte) ((color.R * amount) + backColor.R * (1 - amount)); 
    byte g = (byte) ((color.G * amount) + backColor.G * (1 - amount)); 
    byte b = (byte) ((color.B * amount) + backColor.B * (1 - amount)); 
    return Color.FromArgb(r, g, b); 
} 
+1

Esto sería interesante como una sobrecarga del operador para que pueda escribir: 'Color NewColor = Color1 + Color2;' Un artículo que trata de esto: http://msdn.microsoft.com/en-us/magazine/cc163737.aspx – JYelton

+1

Siempre puede agregar un "esto" solo porque las extensiones son divertidas. – Blam

+0

@Blam: OK, hecho :) – Timwi

5

Si desea mezclar colores de una forma que parezca más natural para el ojo humano, debería considerar trabajar en un espacio de color diferente a RGB, como L*a*b*, HSL, HSB.

Hay un gran code project article on colour spaces con ejemplos en C#.

Puede que desee trabajar con L * a * b *, ya que fue diseñado para linealizar la percepción de las diferencias de color y, por lo tanto, debe producir gradientes elegantes.

Cuestiones relacionadas