C# 如何在XNA中更改颜色色调?

C# 如何在XNA中更改颜色色调?,c#,colors,xna,argb,C#,Colors,Xna,Argb,我的颜色是classMicrosoft.Xna.Framework.color。我怎样才能改变它的色调(或者得到一种色调稍有不同的新颜色)。我是否应该将其转换为System.Drawing.Color,然后以某种方式将其更改并重新转换?我在任何地方都找不到任何有用的信息 编辑 例子: 我有红色的R:255,G:0,B:0。现在我想要稍微多点橙色。然后,如果我得到这个颜色并再次变换,我会得到更多的橙色,然后经过一些变换,我会变成黄色、绿色等。我不知道每种颜色的ARGB的确切值,我不需要它们。我只需

我的颜色是class
Microsoft.Xna.Framework.color
。我怎样才能改变它的色调(或者得到一种色调稍有不同的新颜色)。我是否应该将其转换为
System.Drawing.Color
,然后以某种方式将其更改并重新转换?我在任何地方都找不到任何有用的信息

编辑 例子: 我有红色的R:255,G:0,B:0。现在我想要稍微多点橙色。然后,如果我得到这个颜色并再次变换,我会得到更多的橙色,然后经过一些变换,我会变成黄色、绿色等。我不知道每种颜色的ARGB的确切值,我不需要它们。我只需要将颜色的色调更改一些因子(例如10度)。

根据,您可以将任何想要的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 myColor=新颜色(255,0,0);
对于(int i=0;i您应该使用属性并更改值以获得不同的nyanser

例如:

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

我做了一些研究,发现这个C++代码有:< /P>

我已将代码修改为C#,使用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;
     }
 }
public static void IncreaseHueBy(参考颜色颜色、浮点值、外浮点色调)
{
浮子h、s、v;
RgbToHsv(颜色R、颜色G、颜色B、颜色h、颜色s、颜色v);
h+=数值;
浮子r,g,b;
HsvToRgb(h,s,v,out r,out g,out b);
color.R=(字节)(R);
color.G=(字节)(G);
color.B=(字节)(B);
色调=h;
}
静态空隙RgbToHsv(浮球r、浮球g、浮球b、浮球h、浮球s、浮球v)
{
浮动最小值、最大值、增量;
min=System.Math.min(System.Math.min(r,g),b);
max=System.Math.max(System.Math.max(r,g),b);
v=max;//v
增量=最大-最小值;
如果(最大!=0)
{
s=delta/max;//s
如果(r==最大值)
h=(g-b)/delta;//介于黄色和品红之间
else如果(g==最大值)
h=2+(b-r)/delta;//介于青色和黄色之间
其他的
h=4+(r-g)/delta;//介于品红和青色之间
h*=60;//度
if(h<0)
h+=360;
}
其他的
{
//r=g=b=0//s=0,v未定义
s=0;
h=-1;
}
}
静态空隙HsvToRgb(浮子h、浮子s、浮子v、浮子r、浮子g、浮子b)
{
//防止h超过360度
h=h-((整数)(h/360)*360);
int i;
浮点数f,p,q,t;
如果(s==0)
{
//无色(灰色)
r=g=b=v;
返回;
}
h/=60;//扇区0到5
i=(int)h;
f=h-i;//h的阶乘部分
p=v*(1-s);
q=v*(1-s*f);
t=v*(1-s*(1-f));
开关(一)
{
案例0:
r=v;
g=t;
b=p;
打破
案例1:
r=q;
g=v;
b=p;
打破
案例2:
r=p;
g=v;
b=t;
打破
案例3:
r=p;
g=q;
b=v;
打破
案例4:
r=t;
g=p;
b=v;
打破
默认情况://案例5:
r=v;
g=p;
b=q;
打破
}
}

我测试它时使用了一个值1,每帧增加一个色调,效果相当不错。注意可能有一些舍入错误。

但我需要稍微改变颜色的色调。例如,从橙色到更红色。不从头定义颜色。@eposodex然后只修改RBG属性。您的示例很好地解决了my示例。但它不是通用的:(.我不能将其用于其他颜色组合,并且所有的起始颜色都是可能的。我将尝试转换到
System.Drawing.color
。我认为更像
color.Hue+=10
,因为据我所知,Hue是一个介于0和360之间的数字。@Episodex我刚刚在我的回答中发布了一个链接。它包含从HSV(基于色调)到RBG。你应该能够使用它来获得你想要的表示形式。然后,你的Microsoft.XNA.Framework.Color似乎是用RGB表示的。如果你想要另一种表示形式,你可以学习该表示形式的工作原理并编写一个函数来计算RGB值。我不相信有一个简单的w可以这样做,但根据维基百科,你可以从RGB计算颜色的色调()我不知道你是否可以轻松地从色调转换为RGB。谢谢,我正在检查这个解决方案。当我将
=
切换到

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