在.NET中获取两种颜色的混合

Asked
Viewd1924

3

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

4 个答案

14

好吧,最简单的方法是取红色,绿色,蓝色和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属性是字节,但它们在添加之前将被提升为int,因此不会出现溢出问题。除法的结果仍将在[0,255]范围内,并且FromArgbInt32的值,但丢弃除最低8位以外的所有内容,这正是我们想要的。

一种替代方法是使用其他颜色模型(例如HSV),但这会稍微复杂一些。对于渐变,这应该很好。

  • 您不需要做所有十进制的操作-只需使用\代替/即可使它使用整数除法。您是否关闭了Option Strict?我不希望它会以其他方式编译。

    Jon SkeetNovember 13, 2009 21:06
  • 效果很好。我还必须四舍五入到最接近的整数,否则在某些情况下会崩溃。这是我最终使用的VB代码:

    MyColor = Color.FromArgb(_ Decimal.Round(((((CInt(Color1.A)+ CInt(Color2.A)))/ 2)))_ Decimal.Round(((((CInt(Color1.R)+ CInt(Color2.R))/ 2)))_ Decimal.Round(((((CInt(Color1.G)+ CInt(Color2.G))/ 2)))_ Decimal.Round(((((CInt(Color1.B)+ CInt(Color2.B))/ 2))_ )

    Jeff StockNovember 13, 2009 20:59
2
 CByte((CInt(byte1) + CInt(byte2)) \ 2)
 
6

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

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

8

平均是最好的答案,但请注意:

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

请注意,您使用平均功能越多,结果将变得越灰。