2012-07-11 5 views
4

나는 색깔이 Microsoft.Xna.Framework.Color입니다. 어떻게 색조를 바꿀 수 있습니까 (또는 약간 다른 색조로 새로운 색을 얻을 수 있습니다). System.Drawing.Color으로 변환해야하며 어떻게 든 변경하고 다시 변환 할 수 있습니까? 나는 이것에 대한 유용한 정보를 찾을 수 없다.XNA에서 색조를 변경하는 방법은 무엇입니까?

EDIT 예 : I 은 붉은 색이 R : 255, G : 0, B : 0. 이제 약간 더 주황색을 얻고 싶습니다. 그런 다음이 색상을 얻은 다음 다시 변환하면 더 많은 주황색을 얻을 수 있습니다. 그런 다음 일부 변형 후에 노란색, 녹색 등으로 갈 것입니다. 각 색상의 ARGB의 정확한 값을 알지 못합니다. 그것들이 필요하다. 색상의 색조를 몇 가지 요인 (예 : 10도)으로 변경하면됩니다.

+1

그렇다면 Microsoft.XNA.Framework.Color가 RGB로 표현 된 것 같습니다. 다른 표현을 원한다면, 그 표현이 어떻게 작동 하는지를 배울 수 있고,이를 바탕으로 RGB 값을 계산하는 함수를 작성할 수 있습니다. –

+0

정말 간단한 방법이 있다고 생각하지 않지만 Wikipedia에 따르면 RGB 색상의 색조를 계산할 수 있습니다. (http://en.wikipedia.org/wiki/Hue#Computing_hue_from_RGB) I 당신이 색조에서 RGB로 쉽게 갈 수 있는지 모르겠다. – gb92

답변

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++ 
} 

빨강 및 녹색 빨간색, 노란색, 그래서 숫자가 높을수록이 붉어 만들 수 있도록, 녹색의 숫자가 높을수록 만들 것 녹색 노란색 주황색 빨간색에서 이동하기의 예 그것은 더 푸르다. 두 숫자가 같을수록 더 붉게됩니다.

빛의 기본 색상이 어떻게 작동하는지 알면 색상을 점진적으로 다른 방법으로 변경할 수도 있습니다.
당신은 지금까지 항상 색상의 mathmatical 표현의 일종에 초점을 맞출 것이다 Color.MakeRedder() 또는 Color.MakeGreener()를라는 함수를 찾아 갈 일은 없습니다 (RBG는 가장 일반적입니다하지만 다른 표현이 있습니다) 변환 할 경우

은 당신의 기본 색상 클래스로 System.Drawing.Color 클래스 추적 할 RBG Here is a guide on how to do it

무엇 아마 가장 쉬운 것 것은 색조, 그리고 XNA Color 클래스가 그에 따라 System.Drawing.Color 클래스를 기반으로 수정합니다.

모험심을 갖고 싶다면 Microsoft.Xna.Framework.Color으로 확장 (상속)하는 클래스를 만들 수 있는지, R, G 및 B 속성을 재정 의하여 기본이되는 클래스를 기반으로하는지 확인할 수 있습니다.

+0

하지만 내 색상의 색조를 약간 바꿔야합니다. 따라서 예를 들어 주황색에서 빨간색으로 변합니다. 색상을 처음부터 정의하지 않습니다. – Episodex

+0

@Episodex 그러면 RBG 속성을 수정하십시오. –

+0

직접 질문을 수정하여 자신을 더 분명하게 만들어야합니다. :). – Episodex

6

객체 System.Drawing.Color 당신은 ARGB 속성을 사용하여 다른 nyansers를 얻기 위해 값을 변경해야합니다.

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

+0

내 대답을 편집했습니다. –

+0

감사합니다.이 해결책을 확인하고 있습니다. – Episodex

0
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; 

내가 당신을 이해한다면이 같은 뭔가가 필요 : 예를 들어

제가 조사를 좀 해봤 C++ 코드가이 게시물을 발견 : 나는 C 번호로 코드를 수정 한

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

, IncreaseHueBy 방법을 가지고, 그리고 몇 가지 버그 수정 :

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로 테스트하여 상당히 잘 작동했습니다. 반올림 오류가있을 수 있습니다.