2009-08-26 5 views

答えて

17

.NET Frameworkでこれを行うメソッドはありません。
が、これは実装コードである

void HsvToRgb(double h, double S, double V, out int r, out int g, out int b) 
{  
    double H = h; 
    while (H < 0) { H += 360; }; 
    while (H >= 360) { H -= 360; }; 
    double R, G, B; 
    if (V <= 0) 
    { R = G = B = 0; } 
    else if (S <= 0) 
    { 
    R = G = B = V; 
    } 
    else 
    { 
    double hf = H/60.0; 
    int i = (int)Math.Floor(hf); 
    double f = hf - i; 
    double pv = V * (1 - S); 
    double qv = V * (1 - S * f); 
    double tv = V * (1 - S * (1 - f)); 
    switch (i) 
    { 

     // Red is the dominant color 

     case 0: 
     R = V; 
     G = tv; 
     B = pv; 
     break; 

     // Green is the dominant color 

     case 1: 
     R = qv; 
     G = V; 
     B = pv; 
     break; 
     case 2: 
     R = pv; 
     G = V; 
     B = tv; 
     break; 

     // Blue is the dominant color 

     case 3: 
     R = pv; 
     G = qv; 
     B = V; 
     break; 
     case 4: 
     R = tv; 
     G = pv; 
     B = V; 
     break; 

     // Red is the dominant color 

     case 5: 
     R = V; 
     G = pv; 
     B = qv; 
     break; 

     // Just in case we overshoot on our math by a little, we put these here. Since its a switch it won't slow us down at all to put these here. 

     case 6: 
     R = V; 
     G = tv; 
     B = pv; 
     break; 
     case -1: 
     R = V; 
     G = pv; 
     B = qv; 
     break; 

     // The color is not defined, we should throw an error. 

     default: 
     //LFATAL("i Value error in Pixel conversion, Value is %d", i); 
     R = G = B = V; // Just pretend its black/white 
     break; 
    } 
    } 
    r = Clamp((int)(R * 255.0)); 
    g = Clamp((int)(G * 255.0)); 
    b = Clamp((int)(B * 255.0)); 
} 

/// <summary> 
/// Clamp a value to 0-255 
/// </summary> 
int Clamp(int i) 
{ 
    if (i < 0) return 0; 
    if (i > 255) return 255; 
    return i; 
} 
+6

感謝。色が.GetHue()、.GetSaturation()および.GetBrightness()ですが、.fromHSB()のような逆のメソッドはありません。 – MusiGenesis

+0

確かに...その非常に奇妙な省略、イモ。 – jsight

+0

3つの別々の値に対して* out *を使う代わりに、Colorオブジェクトを返さないのはなぜですか? –

48

Converting HSV to RGB colour using C#

をチェックアウトがあり、これを行うための組み込みの方法はありませんが、計算がひどく複雑ではありません。
ColorのGetHue()、GetSaturation()およびGetBrightness()は、HSVではなくHSL値を返します。

次のC#コードは、Wikipediaに記載されているアルゴリズムを使用してRGBとHSVを変換します。
私は既にこの回答をhereとして掲載していますが、ここでコードをコピーして簡単に参照できます。 Windowsシステムカラーにしてからを含むすべての必要な変換を提供するために、優れたC#クラスを持っているhttp://richnewman.wordpress.com/hslcolor-class/

public static void ColorToHSV(Color color, out double hue, out double saturation, out double value) 
{ 
    int max = Math.Max(color.R, Math.Max(color.G, color.B)); 
    int min = Math.Min(color.R, Math.Min(color.G, color.B)); 

    hue = color.GetHue(); 
    saturation = (max == 0) ? 0 : 1d - (1d * min/max); 
    value = max/255d; 
} 

public static Color ColorFromHSV(double hue, double saturation, double value) 
{ 
    int hi = Convert.ToInt32(Math.Floor(hue/60)) % 6; 
    double f = hue/60 - Math.Floor(hue/60); 

    value = value * 255; 
    int v = Convert.ToInt32(value); 
    int p = Convert.ToInt32(value * (1 - saturation)); 
    int q = Convert.ToInt32(value * (1 - f * saturation)); 
    int t = Convert.ToInt32(value * (1 - (1 - f) * saturation)); 

    if (hi == 0) 
     return Color.FromArgb(255, v, t, p); 
    else if (hi == 1) 
     return Color.FromArgb(255, q, v, p); 
    else if (hi == 2) 
     return Color.FromArgb(255, p, v, t); 
    else if (hi == 3) 
     return Color.FromArgb(255, p, q, v); 
    else if (hi == 4) 
     return Color.FromArgb(255, t, p, v); 
    else 
     return Color.FromArgb(255, v, p, q); 
} 
+0

ColorFromHSVに問題があるかもしれません。逆の色のコードを使用して色相を180度回転させようとしましたが、うまく機能しません。受け入れられたコードは、私にとって正しいと思われる異なる色を与えます。 –

+0

私はあなたのColorToHSV関数を使用しています。うまくいくようです。 –

+0

@IsaacBolingerはネガティブな色相ではうまく動作しません。色相> = 0ではうまく動作しますが、<0,360の間では色相を使用する方が適しています。 – xmedeko

-1

ルック。

+0

HSLではなく、HSB/Vが問題になります。これはしばしば混同されます。実際、マイクロソフト自身は、Color.GetBrightness()をHSBと呼ぶことによって、間違ってそれを得ています。実際にはHSLです。 – redshift5

12

これは組み込まれていませんが、ColorMineと呼ばれるオープンソースのC#ライブラリがあり、色空間を簡単に変換することができます。 HSVへ

Rgbの:RGBに

var rgb = new Rgb {R = 123, G = 11, B = 7}; 
var hsv = rgb.To<Hsv>(); 

HSV:その方法について

var hsv = new Hsv { H = 360, S = .5, L = .17 } 
var rgb = hsv.to<Rgb>(); 
関連する問題