2009-06-11 83 views
0

我該怎麼做?轉換RGB方法?

int blue = Color.Blue.ToArgb(); 
int yellow = Color.Yellow.ToArgb(); 

blue = (blue + yellow)/2; 

Color Blue = ConvertFromRGB(blue); 
+0

這是Noldorin和Jason Heine之間的心理調試攤牌。誰會贏?不要離開你的座位 – 2009-06-11 13:01:22

+0

哈哈。是的,OP的目標並不完全清楚,但我正盡我所能地設想。 – Noldorin 2009-06-11 13:07:43

+0

:)完全同意,今天早上醒來的方法是什麼! – CodeLikeBeaker 2009-06-11 13:08:57

回答

8

我想你要找的東西是這樣的:

var blueColor = Color.FromArgb((blue + yellow)/2); 

不過,我認爲這會給你你真正想要的結果。

您必須非常小心以這種方式混合顏色。就編碼器而言,表示ARGB格式的顏色的值是相當任意的。這也可能是最好的RGB分量單獨混合,如:

var color1 = Color.Blue; 
var color2 = Color.Yellow; 
var blueColor = Color.FromArgb((color1.R + color2.R)/2, 
    (color1.G + color2.G)/2, (color1.B + color2.B)/2); 

兩種顏色之間的插值(以中心點),並應給你的東西,看起來更像是兩種顏色的混合。

(請注意,我假設你指的是System.Drawing.Color類型在這裏。)

+0

+1對於顏色混合的明確解釋 – CodeLikeBeaker 2009-06-11 13:20:18

3

我覺得這是你可能會尋找:

int blue = Color.Blue.ToArgb(); 
int yellow = Color.Yellow.ToArgb(); 

blue = (blue + yellow)/2; 

Color Blue = Color.FromArgb(blue); 
1

只是平均的顏色組件的方式,如果那是你正在嘗試做的:

​​
0

這將是有益的知道你從第二分配期待「藍色」是什麼 - 你肯定不會得到的陰影藍色(更像紅色)。

問題是Color類將ARGB值保留爲Int32,因爲每個4字節表示Alpha,Red,Blue和Green值之一。

問到加在一起的兩種顏色在他們的Int32形式將會導致意外的值,如一個字節的「溢出」到下一個(當您添加255和1會發生什麼?)

Color.Blue,爲例如,是-16776961。這是因爲它有4個字節是這個樣子:

0: 255 
1: 0 
2: 0 
3: 255 

或者:

11111111 00000000 00000000 11111111 

你會發現它更清楚打破ARGB成分分解成單個字節的System.Drawing.Color允許您可以通過它的實例屬性做到這一點:

blue.A 
blue.R 
blue.G 
blue.B 

您可以安全地處理這些,但要記住,他們是字節的一個實例,所以你不能分配一個值超出範圍0-255的。若要從組件字節的顏色,使用方法:

Color.FromArgb(a, r, g, b); 

a, r, g, b是字節。

有點混淆,Color.FromArgb接受int參數,而不是字節。恐怕我不知道爲什麼,比我更好的人將不得不回答這個問題,而是將一個字節轉換爲一個int,併產生一個介於0和255之間的int值,因此使用這個值是安全的。Color也有一個私有的CheckByte類,它傳遞每個參數,所以你會得到一個ArgumentException,而不是一個意想不到的顏色(你可能會用非組件方法得到)。