【问题标题】:Is there an easy way to blend two System.Drawing.Color values?有没有一种简单的方法来混合两个 System.Drawing.Color 值?
【发布时间】:2011-04-12 22:42:54
【问题描述】:

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

如果我这样做了,怎么办?

【问题讨论】:

  • 如何组合它们?如果你把红色颜料和蓝色颜料混合在一起,你会得到紫色颜料,但是如果你透过红色玻璃看一个蓝色的球,这个球看起来是黑色的,而不是紫色的。您想到了哪种混合方式?
  • @Eric Lippert:我认为每个人都非常清楚他的意思是 Alpha 混合。任何其他类型的混合都更加罕见和专业,所以他会明确提到它。
  • @Timwi:我不清楚,所以每个人都不清楚。也许除了我以外的所有人都很清楚。

标签: c# .net colors gdi+


【解决方案1】:

我认为混合一组颜色更容易,以防你想混合超过 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);

【讨论】:

    【解决方案2】:

    如果您想以人眼看起来更自然的方式混合颜色,则应考虑在与 RGB 不同的颜色空间中工作,例如L*a*b*、HSL、HSB。

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

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

    【讨论】:

      【解决方案3】:

      我正是为此目的编写了一个实用方法。 :)

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

      【讨论】:

      • 这将是一个有趣的运算符重载,因此您可以编写:Color NewColor = Color1 + Color2; 处理此问题的文章:msdn.microsoft.com/en-us/magazine/cc163737.aspx
      • 您可以随时添加“this”,因为扩展很有趣。
      • 根据颜色,线性混合可以使结果颜色变暗。
      • alpha 值是多少?
      • 不错的一个。我只认为“数量”值在我看来是倒退的;)当我阅读 color.Blend(target, 0.9) 时,我预计几乎不会留下任何原始颜色
      【解决方案4】:

      我不完全确定你想用混合做什么,但你可以看看 alpha blending http://en.wikipedia.org/wiki/Alpha_compositing

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-21
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多