public static Color Blend(this Color bg, Color fg) { if (fg.A == 255) return fg; if (fg.A == 0) return bg; float resultA = (1 - (1 - fg.GetFloatA()) * (1 - bg.GetFloatA())); float resultR = (fg.GetFloatR() * fg.GetFloatA() / resultA + bg.GetFloatR() * bg.GetFloatA() * (1 - fg.GetFloatA()) / resultA); float resultG = (fg.GetFloatG() * fg.GetFloatA() / resultA + bg.GetFloatG() * bg.GetFloatA() * (1 - fg.GetFloatA()) / resultA); float resultB = (fg.GetFloatB() * fg.GetFloatA() / resultA + bg.GetFloatB() * bg.GetFloatA() * (1 - fg.GetFloatA()) / resultA); return CreateColorFromFloat(resultA, resultR, resultG, resultB); }