2009-11-13 42 views

回答

14

那么,简单方式是采取每个红,绿,蓝和阿尔法值的平均值:

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),但这会稍微复杂一些。对于渐变,这应该没问题。

+0

这很好。我也不得不四舍五入到最接近的整数,否则在某些情况下会崩溃。这是我最终使用的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))__ ) – 2009-11-13 20:59:13

+4

你不需要做所有的小数 - 只用\来代替/使用整数除法。你有Option Strict关闭吗?我不希望它另外编译。 – 2009-11-13 21:06:13

6

按颜色你是指Color struct的实例吗?

如果是这样,则依次取每个R,GB组件,并计算每个组件的平均值。合并结果以获得混合的颜色。

8

平均是最好的答案,但一个忠告:

颜色均值的一个问题是,除非它们是相同的专题系列,(高R,低G,低B),那么您会最终趋向灰色。

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

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