2012-07-11 48 views
4

我有一個顏色類Microsoft.Xna.Framework.Color。我怎樣才能改變它的色調(或者以略微不同的色調來獲得新的顏色)。我應該將其轉換爲System.Drawing.Color,然後以某種方式更改並轉換回來?我無法在任何地方找到任何有用的信息。如何更改XNA中的色調?

EDIT 實施例: 我有紅色R:255,G:0,B:0。現在我想要獲得更多的橙色。然後,如果我獲得了這種顏色並再次轉換,我會得到更多的橙色,然後經過一些轉換後,我會去黃色,綠色等。我不知道每種顏色的ARGB的確切值,我不需要他們。我只需要通過一些因素(例如10度)來改變顏色的色調。

+1

那麼,你的Microsoft.XNA.Framework.Color似乎用RGB表示。如果您想要另一種表示,則可以瞭解該表示如何工作,然後編寫一個函數來計算基於此值的RGB值。 – 2012-07-11 20:54:15

+0

我不認爲有這樣做的簡單方法,但根據維基百科,可以計算RGB顏色的色相(http://en.wikipedia.org/wiki/Hue#Computing_hue_from_RGB) I不知道你是否可以輕鬆地從Hue轉到RGB。 – gb92 2012-07-12 02:42:49

回答

2

根據this documentation,你可以傳遞你想要的任何RGB(A)值到XNA顏色類的構造函數中。您也可以使用R,B和G性質改變他們事後

例如:

Color myColor = new Color(150, 100, 100); 

myColor.R = 200 

這個例子將改變一個紅色的略深的紅色。

使顏色從紅色到橙色到黃色到綠色將

Color myColor = new Color(255, 0, 0); 

for(int i=0; i<255; i++) 
{ 
    myColor.R--; 
    myColor.G++ 
} 

紅色和綠色製造的紅,黃,號碼,以便提高將使其更紅,綠的數字更高將使的例子它更綠。兩個數字相同使它更紅。

只要您知道光的基色如何工作,您也可以用其他方式遞增地改變顏色。
你永遠會找到一個叫Color.MakeRedder()Color.MakeGreener()功能將始終專注於某種顏色的工科數學表示,(RBG是最常見的,但也有其他表示)

如果你想轉換色調RBG Here is a guide on how to do it

什麼很可能是最簡單的就是保持System.Drawing.Color類作爲您的基色類的軌跡,並根據您的XNA Color類您System.Drawing.Color類進行相應的修改。

如果你想變得非常冒險,你可以看看是否可以創建一個擴展(繼承自Microsoft.Xna.Framework.Color)的類,覆蓋R,G和B屬性,以便它們基於底層System.Drawing.Color對象

+0

但我需要稍微改變我的顏色的色調。所以從橙色到更紅色的例子。沒有從頭開始定義顏色。 – Episodex 2012-07-11 20:43:14

+0

@Episodex然後只是修改RBG屬性 – 2012-07-11 20:46:34

+0

我必須編輯我的問題,使自己更清楚:)。 – Episodex 2012-07-11 20:47:55

6

您應該使用ARGB屬性並更改值以獲取不同的nyansers。

例如:

Color color = new Color(0,0,0); 
//Then you can change the argb properties: 
color.A = 10; 
color.R = 15; 
color.G = 9; 
color.B = 25; 

如果我理解你需要的東西是這樣的:

public static class Utilities 
{ 
    public static void Increase(this Color color, int value) 
    { 
     if(color.R >= color.G && color.R >= color.B) 
      color.R += value; 
     else if(color.G >= color.R && color.G >= color.B) 
      color.G += value; 
     else 
      color.B += value; 
    } 

    public static void Decrease(this Color color, int value) 
    { 
     if(color.R <= color.G && color.R <= color.B) 
      color.R -= value; 
     else if(color.G <= color.R && color.G <= color.B) 
      color.G -= value; 
     else 
      color.B -= value; 
    } 
} 

然後:

Color myColor = new Color(10,0,0); 
myColor.Increase(10); 
//or 
myColor.Decrease(10); 
+0

請檢查我的編輯。 – Episodex 2012-07-11 20:52:26

+0

我編輯了我的答案。 – 2012-07-11 21:08:18

+0

謝謝,我正在檢查此解決方案。 – Episodex 2012-07-11 21:19:12

0

我做了一些研究,發現這個帖子裏面有C++代碼:

http://www.cs.rit.edu/~ncs/color/t_convert.html

我已經修改了代碼爲C#,有一個IncreaseHueBy方法,並修復一些bug:

public static void IncreaseHueBy(ref Color color, float value, out float hue) 
{ 
    float h, s, v; 

    RgbToHsv(color.R, color.G, color.B, out h, out s, out v); 
    h += value; 

    float r, g, b; 

    HsvToRgb(h, s, v, out r, out g, out b); 


    color.R = (byte)(r); 
    color.G = (byte)(g); 
    color.B = (byte)(b); 

    hue = h; 
} 

static void RgbToHsv(float r, float g, float b, out float h, out float s, out float v) 
{ 
    float min, max, delta; 
    min = System.Math.Min(System.Math.Min(r, g), b); 
    max = System.Math.Max(System.Math.Max(r, g), b); 
    v = max;    // v 
    delta = max - min; 
    if (max != 0) 
    { 
     s = delta/max;  // s 

     if (r == max) 
      h = (g - b)/delta;  // between yellow & magenta 
     else if (g == max) 
      h = 2 + (b - r)/delta; // between cyan & yellow 
     else 
      h = 4 + (r - g)/delta; // between magenta & cyan 
     h *= 60;    // degrees 
     if (h < 0) 
      h += 360; 
    } 
    else 
    { 
     // r = g = b = 0  // s = 0, v is undefined 
     s = 0; 
     h = -1; 
    } 

} 
static void HsvToRgb(float h, float s, float v, out float r, out float g, out float b) 
{ 
    // Keeps h from going over 360 
    h = h - ((int)(h/360) * 360); 

    int i; 
    float f, p, q, t; 
    if (s == 0) 
    { 
     // achromatic (grey) 
     r = g = b = v; 
     return; 
    } 
    h /= 60;   // sector 0 to 5 

    i = (int)h; 
    f = h - i;   // factorial part of h 
    p = v * (1 - s); 
    q = v * (1 - s * f); 
    t = v * (1 - s * (1 - f)); 
    switch (i) 
    { 
     case 0: 
      r = v; 
      g = t; 
      b = p; 
      break; 
     case 1: 
      r = q; 
      g = v; 
      b = p; 
      break; 
     case 2: 
      r = p; 
      g = v; 
      b = t; 
      break; 
     case 3: 
      r = p; 
      g = q; 
      b = v; 
      break; 
     case 4: 
      r = t; 
      g = p; 
      b = v; 
      break; 
     default:  // case 5: 
      r = v; 
      g = p; 
      b = q; 
      break; 
    } 
} 

我測試了它的值爲1,每幀增加1,色調相當好。注意可能會有一些舍入錯誤。