/// <summary>
/// a helper class for color blend
/// </summary>
public class ColorBlendHelper
{
/// <summary>
/// blend SolidColorBrushes
/// </summary>
/// <param name="colorBrush1"></param>
/// <param name="colorBrush2"></param>
/// <returns></returns>
public static SolidColorBrush SolidColorBrushBlend(SolidColorBrush colorBrush1,SolidColorBrush colorBrush2)
{
return new SolidColorBrush()
{
Color = ColorBlend(SolidColorBrush2Color(colorBrush1), SolidColorBrush2Color(colorBrush2))
};
}
/// <summary>
/// Calculation of two colors blend of new color values
/// R,G,B∈(0 , 255) A∈(0 , 1)
/// Color(A,R,G,B) = Color(A1,R1,G1,B1) + Color(A2,R2,G2,B2)
/// </summary>
/// <param name="cor1"></param>
/// <param name="cor2"></param>
/// <returns>blend color</returns>
public static System.Windows.Media.Color ColorBlend(System.Windows.Media.Color cor1, System.Windows.Media.Color cor2)
{
double Alpha1 = cor1.A / 255d;
double Alpha2 = cor2.A / 255d;
double R1 = cor1.R / 255d;
double R2 = cor2.R / 255d;
double G1 = cor1.G / 255d;
double G2 = cor2.G / 255d;
double B1 = cor1.B / 255d;
double B2 = cor2.B / 255d;
return new System.Windows.Media.Color()
{
A = (byte)(ColorAlphaBlendCalculate(Alpha1, Alpha2) * 255d),
R = (byte)(ColorRGBBlendCalculate(Alpha1, Alpha2, R1, R2) * 255d),
G = (byte)(ColorRGBBlendCalculate(Alpha1, Alpha2, G1, G2) * 255d),
B = (byte)(ColorRGBBlendCalculate(Alpha1, Alpha2, B1, B2) * 255d)
};
}
/// <summary>
/// Through two kinds of color's R/G/B and Alpha, calculate a new value
/// R/G/B use the same formula
/// For example:
/// R : blend Red ;
/// A : blend alpha ;
/// R = (a1 * R1 + (1 - a1) * a2 * R2) / A
/// </summary>
/// <param name="a1">Alpha1</param>
/// <param name="a2">Alpha2</param>
/// <param name="c1">color's R/G/B</param>
/// <param name="c2">color's R/G/B</param>
/// <returns>nwe color's R/G/B</returns>
public static double ColorRGBBlendCalculate(double a1, double a2, double c1, double c2)
{
return (a1 * c1 + (1d - a1) * a2 * c2) / ColorAlphaBlendCalculate(a1, a2);
}
/// <summary>
/// calculate blend alpha value
/// α : blend alpha value
/// double α = Clolor.A / 255d
/// α,α1,α2 ∈(0 , 1)
/// α=1−(1−α1)∗(1−α2) = α1 + α2 - α1 * α2
/// </summary>
/// <param name="alpha1"></param>
/// <param name="alpha2"></param>
/// <returns></returns>
public static double ColorAlphaBlendCalculate(double alpha1, double alpha2)
{
return alpha1 + alpha2 - alpha1 * alpha2;
}
/// <summary>
/// convert a SolidColorBrush to a color
/// pay attention to transparency value
/// </summary>
/// <param name="colorBrush"></param>
/// <returns></returns>
public static System.Windows.Media.Color SolidColorBrush2Color(SolidColorBrush colorBrush)
{
var cor = colorBrush.Color;
cor.A = (byte)(colorBrush.Opacity * cor.A);
return cor;
}
}
看注释就能理解 支持Color混合 和SolidColorBrush混合