我希望能够混合两个或更多的Color对象。假设我有一个半透明的红色:
var blue = Color.FromArgb(140, 0, 0, 255);
这次,我想得到这张图片中间看到的青绿色。
我猜这是代码版的我的Paint.Net步骤,将一个半透明的彩色矩形绘制在另一个上面。然而,我希望能够计算最终混合的颜色,并在一次调用中使用它,而不是调用该方法三次以实现混合效果。
最后,这是我之前提到的那种颜色混合代码片段的示例,当我将它们用于我的颜色时,通常会产生棕色的阴影:-
var red = Color.FromArgb(140, 255, 0, 0);
然后我想将一个半透明的绿色混合进去:
var green = Color.FromArgb(140, 0, 255, 0);
我找到的颜色混合代码片段通常会产生一种棕色的色调,但我真正想要的效果是像在(比如)Paint.Net中绘制一种颜色覆盖另一种颜色所得到的效果,从而产生更深的绿色:
我希望能够混合第三种颜色,比如半透明的蓝色:var blue = Color.FromArgb(140, 0, 0, 255);
这次,我想得到这张图片中间看到的青绿色。
如果我尝试使用常规的代码片段,那么通常会得到灰色或棕色的结果。
顺便提一下,以下代码基本上实现了我想要的效果:
using (var bitmap = new Bitmap(300, 300))
{
using (var g = Graphics.FromImage(bitmap))
{
var c1 = Color.FromArgb(alpha: 128, red: 255, green: 0, blue: 0);
var c2 = Color.FromArgb(alpha: 200, red: 0, green: 255, blue: 0);
var c3 = Color.FromArgb(alpha: 100, red: 0, green: 0, blue: 255);
g.FillRectangle(new SolidBrush(c1), 100, 0, 100, 100);
g.FillRectangle(new SolidBrush(c2), 125, 75, 100, 100);
g.FillRectangle(new SolidBrush(c3), 75, 50, 100, 100);
}
}
我猜这是代码版的我的Paint.Net步骤,将一个半透明的彩色矩形绘制在另一个上面。然而,我希望能够计算最终混合的颜色,并在一次调用中使用它,而不是调用该方法三次以实现混合效果。
最后,这是我之前提到的那种颜色混合代码片段的示例,当我将它们用于我的颜色时,通常会产生棕色的阴影:-
private Color Blend(Color c1, Color c2)
{
var aOut = c1.A + (c1.A * (255 - c1.A) / 255);
var rOut = (c1.R * c1.A + c2.R * c2.A * (255 - c1.A) / 255) / aOut;
var gOut = (c1.G * c1.A + c2.G * c2.A * (255 - c1.A) / 255) / aOut;
var bOut = (c1.B * c1.A + c2.B * c2.A * (255 - c1.A) / 255) / aOut;
return Color.FromArgb(aOut, rOut, gOut, bOut);
}