2009-08-26 17 views

cevap

17

.NET çerçevesinde bunu yapan bir yöntem olduğunu sanmıyorum.
Kontrol dışarı Converting HSV to RGB colour using C#

Bu

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

teşekkürler. Renk, .GetHue(), .GetSaturation() ve .GetBrightness(), ancak .fromHSB() gibi ters bir yöntem yoktur garip. – MusiGenesis

+0

Gerçekten de ... çok tuhaf bir ihmal, imo. – jsight

+0

Niçin üç ayrı değer için * out * kullanmak yerine bir Color nesnesi döndürmüyor? –

48

Bunu yapmak için yerleşik bir yöntem yoktur, uygulama kodu, ama hesaplamalar korkunç karmaşık değildir.
Ayrıca, Color'ın GetHue(), GetSaturation() ve GetBrightness() HSV değil, HSL değerlerini döndürdüğünü unutmayın.

Aşağıdaki C# kodu, Wikipedia'da açıklanan algoritmaları kullanarak RGB ve HSV arasında dönüştürür.
Bu cevabı zaten gönderdim, ancak hızlı başvuru için kodu buraya kopyalayacağım. ve windows sistem renklerden dahil olmak üzere tüm gerekli dönüşümleri sağlamak için mükemmel bir C# sınıfı vardır http://richnewman.wordpress.com/hslcolor-class/ de

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'nizde bir sorun olabilir, aksi halde kodunuzu kullanarak tonunuzu 180 derece döndürmeye çalışıyordum ve çok iyi çalışmıyor. Kabul edilen kod, bana uygun görünen farklı bir renk verir. –

+0

Ancak, ColorToHSV işlevini kullanıyorum. Gayet iyi görünüyor. –

+0

@IsaacBolinger, negatif renk tonuyla iyi çalışmaz, tonu> = 0 için iyi çalışır, ancak kodunuzda <0, 360 arasında renk tonu kullanmak daha iyidir. – xmedeko

-1

bak.

+0

Soru, çoğu zaman karışık olan HSL/HS değil HSB/V içindir. Aslında Microsoft, Color.GetBrightness() 'ın HSB olduğu ve gerçekte HSL olduğu yönündedir. – redshift5

12

İçinde yerleşik değil, ancak renk boşlukları arasında kolayca dönüştürmeyi sağlayan ColorMine adlı açık kaynaklı bir C# kitaplığı var. Hsv için

Rgb: rgb için

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

Hsv: Yönteme

var hsv = new Hsv { H = 360, S = .5, L = .17 } 
var rgb = hsv.to<Rgb>(); 
İlgili konular