4

クラスの色がありMicrosoft.Xna.Framework.Colorます。どうすればその色相を変更できますか(またはわずかに異なる色相の新しい色を取得できます)。に変換してからSystem.Drawing.Color、どういうわけか変更して元に戻す必要がありますか?これに関する有用な情報はどこにも見つかりません。

編集 例:私は赤い色R:255、G:0、B:0を持っています。もう少しオレンジ色にしたいです。次に、この色を取得して再度変換すると、さらにオレンジ色になり、いくつかの変換後、黄色、緑などになります。各色のARGBの正確な値がわからないため、わかりません。それらが必要です。色の色相を何らかの要因(たとえば10度)で変更する必要があります。

4

3 に答える 3

6

A R G Bプロパティを使用し、値を変更して別の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;
    }
}

それで:

Color myColor = new Color(10,0,0);
myColor.Increase(10);
//or
myColor.Decrease(10);
于 2012-07-11T20:44:28.327 に答える
1

このドキュメントによると、必要な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に変換したい場合ここにそれを行う方法のガイドがあります

System.Drawing.Colorおそらく最も簡単なのは、ベースカラークラスとしてクラスを追跡し、それに応じてクラスにColor基づいてXNAクラスを変更することSystem.Drawing.Colorです。

本当に冒険したい場合はMicrosoft.Xna.Framework.Color、R、G、およびBプロパティを拡張(継承)し、オーバーライドして、基になるSystem.Drawing.Colorオブジェクトに基づくクラスを作成できるかどうかを確認できます。

于 2012-07-11T20:39:26.420 に答える
1

私はいくつかの調査を行い、C++コードを含むこの投稿を見つけました:

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

コードを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;
     }
 }

フレームごとに色相を1ずつ増やすために、値1を使用してテストしましたが、かなりうまく機能しました。丸め誤差がある可能性があることに注意してください。

于 2012-10-20T04:56:00.567 に答える