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

Mat*_*att 17 .net c# gdi+ colors

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

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

Tim*_*mwi 34

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

/// <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);
}
Run Code Online (Sandbox Code Playgroud)

  • 根据颜色的不同,线性混合会使得到的颜色变暗. (6认同)
  • 好一个.我只认为'数量'值在我看来是倒退的;)当我读取color.Blend(目标,0.9)时,我几乎不会想到任何原始颜色 (4认同)
  • alpha 值又如何呢? (2认同)

Dre*_*kes 6

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

有关色彩空间的优秀代码项目文章以及C#中的示例.

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