WPF 颜色混合计算

    /// <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混合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值