繁体   English   中英

在 .NET 中混合两种颜色

[英]Get blend of two colors in .NET

我的 .NET 应用程序中有两种颜色是用户定义的。 我想以某种方式获得这两种颜色之间的颜色。 它是渐变中间的颜色。 有什么办法可以做到这一点吗?

嗯,最简单的方法是取每个红色、绿色、蓝色和 alpha 值的平均值:

Color c1 = ...;
Color c2 = ...;
Color midpoint = Color.FromArgb((c1.A + c2.A) / 2,
                                (c1.R + c2.R) / 2,
                                (c1.G + c2.G) / 2,
                                (c1.B + c2.B) / 2);

尽管 A、R、G 和 B 属性是字节,但它们在添加之前会被提升为整数,因此不会出现溢出问题。 除法的结果仍将在 [0, 255] 范围内, FromArgb采用Int32值,但丢弃除最低 8 位以外的所有内容 - 这正是我们想要的。

另一种方法是使用不同的颜色模型(例如 HSV),但这会稍微复杂一些。 对于渐变,这应该没问题。

求平均值是最好的答案,但要注意:

颜色平均值的一个问题是,除非它们属于同一个主题系列(高 R、低 G、低 B),否则您最终会倾向于灰色。

请注意,您使用平均函数的次数越多,结果将变得越灰色。

颜色是指Color结构的实例吗?

如果是这样,只需依次取每个RGB分量,并计算每个分量的平均值。 组合结果以获得混合颜色。

CByte((CInt(byte1) + CInt(byte2)) \ 2)

因此正在寻找解决方案并决定将平均想法建立为一般的,有点蛮力哈哈,希望这对将来的某人有所帮助。

// GetColors by Matt Meents, creates const foreach ARGB and then sum out the colors...
public static Color[] GetColors(Color A, Color B, int HowMany) {
  List<Color> aRet = new List<Color>();
  aRet.Add(A);
  if (HowMany > 0) {
    Int32 iCount = 0;        
    int sA = (B.A - A.A) / (HowMany + 1);
    int sR = (B.R - A.R) / (HowMany + 1);
    int sG = (B.G - A.G) / (HowMany + 1);
    int sB = (B.B - A.B) / (HowMany + 1);
    int AA = A.A; int AR = A.R; int AG = A.G; int AB = A.B;        
    while (iCount < HowMany) {
      AA += sA; AR += sR; AG += sG; AB += sB;
      if (AA > 255) AA = 255;  if (AA < 0) AA = 0;
      if (AR > 255) AR = 255;  if (AR < 0) AR = 0;
      if (AG > 255) AG = 255;  if (AG < 0) AG = 0;
      if (AB > 255) AB = 255;  if (AB < 0) AB = 0;
      aRet.Add(Color.FromArgb(AA, AR, AG, AB));
      iCount++;
    }
  }
  aRet.Add(B);
  return aRet.ToArray();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM