【C#】目标正向计算目标颜色 ,逆向计算叠加颜色

 private double crCalculateBlend(double a1, double a2, double c1, double c2)
        {
            return (c1 * a1 * (1.0 - a2) + c2 * a2) / (a1 + a2 - a1 * a2);
        }

        private double crAdd(double src, double dst, double a = 0.5)
        {
            return (dst - src * (1.0 - a)) / a;
        }
        /// <summary>
        /// 由背景颜和目标颜计算叠加色
        /// </summary>
        /// <param name="cor1"></param>
        /// <param name="cor2"></param>
        /// <returns></returns>
        private Color crAdd(Color cor1, Color cor2)
        {
            cor1 = Color.FromArgb(225, 225, 225);
            cor2 = Color.FromArgb(229, 241, 251);
            double fAlpBlend = 0.5;

            for(double i=0;i<=1;i+=0.01)
            {
                double fRed1 = cor1.R / 255.0;
                double fRed2 = cor2.R / 255.0;
                fAlpBlend = i;
                double fRedBlend = crAdd(fRed1, fRed2, fAlpBlend);

                double fGreen1 = cor1.G / 255.0;
                double fGreen2 = cor2.G / 255.0;
                double fGreenBlend = crAdd(fGreen1, fGreen2, fAlpBlend);

                double fBlue1 = cor1.B / 255.0;
                double fBlue2 = cor2.B / 255.0;
                double fBlueBlend = crAdd(fBlue1, fBlue2, fAlpBlend);
                if (fGreenBlend >= 0 && fRedBlend >= 0 && fBlueBlend >= 0 && fGreenBlend <= 1.0 && fRedBlend <= 1.0 && fBlueBlend <= 1.0)
                return Color.FromArgb((int)(fAlpBlend * 255), (int)(fRedBlend * 255), (int)(fGreenBlend * 255), (int)(fBlueBlend * 255));
            }
            return Color.Black;
        }
        /// <summary>
        /// 由背景色和叠加色计算目标色
        /// </summary>
        /// <param name="cor1"></param>
        /// <param name="cor2"></param>
        /// <returns></returns>
        private Color crColorBlend(Color cor1, Color cor2)
        {
            double fAlp1 = cor1.A / 255.0;
            double fAlp2 = cor2.A / 255.0;
            double fAlpBlend = fAlp1 + fAlp2 - fAlp1 * fAlp2;

            double fRed1 = cor1.R / 255.0;
            double fRed2 = cor2.R / 255.0;
            double fRedBlend = crCalculateBlend(fAlp1, fAlp2, fRed1, fRed2);

            double fGreen1 = cor1.G / 255.0;
            double fGreen2 = cor2.G / 255.0;
            double fGreenBlend = crCalculateBlend(fAlp1, fAlp2, fGreen1, fGreen2);

            double fBlue1 = cor1.B / 255.0;
            double fBlue2 = cor2.B / 255.0;
            double fBlueBlend = crCalculateBlend(fAlp1, fAlp2, fBlue1, fBlue2);
            return Color.FromArgb((int)(fAlpBlend * 255), (int)(fRedBlend * 255), (int)(fGreenBlend * 255), (int)(fBlueBlend * 255));
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值