2009-11-13 27 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)