有没有一种简单的方法来混合两个System.Drawing.Color值?

时间:2010-09-15 22:22:50

标签: c# .net colors gdi+

是否有一种简单的方法可以混合两个System.Drawing.Color值?或者我是否必须编写自己的方法来采用两种颜色并将它们组合起来?

如果我这样做,那怎么可能呢?

4 个答案:

答案 0 :(得分:33)

我正是为了这个目的写了一个实用工具方法。 :)

/// <summary>Blends the specified colors together.</summary>
/// <param name="color">Color to blend onto the background color.</param>
/// <param name="backColor">Color to blend the other color onto.</param>
/// <param name="amount">How much of <paramref name="color"/> to keep,
/// “on top of” <paramref name="backColor"/>.</param>
/// <returns>The blended colors.</returns>
public static Color Blend(this Color color, Color backColor, double amount)
{
    byte r = (byte) ((color.R * amount) + backColor.R * (1 - amount));
    byte g = (byte) ((color.G * amount) + backColor.G * (1 - amount));
    byte b = (byte) ((color.B * amount) + backColor.B * (1 - amount));
    return Color.FromArgb(r, g, b);
}

答案 1 :(得分:6)

如果您希望以对人眼看起来更自然的方式混合颜色,则应考虑使用与RGB不同的颜色空间,例如L*a*b*,HSL,HSB。

在C#中有一个很棒的code project article on colour spaces示例。

您可能喜欢使用L * a * b *,因为它旨在将色差的感知线性化,因此应该产生优雅的渐变。

答案 2 :(得分:3)

我不完全确定您要尝试使用混合,但您可以查看Alpha混合http://en.wikipedia.org/wiki/Alpha_compositing

答案 3 :(得分:0)

我认为混合一系列颜色更容易,以防您想要混合超过 2 种颜色 这是我的功能:

private Color colorBlend(List<Color> clrArr)
{   
    int r = 0;
    int g = 0;
    int b = 0;
    foreach(Color color in clrArr)
    {
        r += color.R;
        g += color.G;
        b += color.B;
    }
    r = r / clrArr.Count;
    g = g / clrArr.Count;
    b = b / clrArr.Count;
    return Color.FromArgb(r, g, b);
}

数组必须是颜色列表 使用:

List<Color> colorList = new List<Color>();
colorList.Add(Color.Red);
colorList.Add(Color.Blue);
picturebox.backColor = colorBlend(colorList);