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));
}