Existe-t-il une API système C#/. NET intégrée pour HSV en RVB?

Existe-t-il une API intégrée dans. NET framework pour convertir HSV en RVB? Je n'ai pas vu de méthode dans le système.Dessin.Couleur pour cela, mais il semble surprenant qu'il n'y en aurait pas dans la plate-forme.

27
demandé sur Peter Mortensen 2009-08-26 19:08:22

4 réponses

Je ne pense pas qu'il y ait une méthode qui le fasse dans le framework.net.
Consultez Conversion HSV en couleur RVB en utilisant C #

C'est le code d'implémentation,

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;
}
19
répondu Patrik Svensson 2014-06-03 15:45:58

Il N'y a pas de méthode intégrée pour le faire, mais les calculs ne sont pas terriblement complexes.
Notez également que les couleurs Gethue(), GetSaturation() et Getbrightness() renvoient des valeurs HSL, pas HSV.

Le code C# suivant convertit entre RVB et HSV en utilisant les algorithmes décrits sur Wikipedia .
J'ai déjà posté cette réponse ici, mais je vais copier le code ici pour référence rapide.

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);
}
48
répondu Greg 2017-05-23 12:02:11

Ce n'est pas intégré, mais il y a une bibliothèque C# open-source appelée ColorMine qui rend la conversion entre les espaces colorimétriques assez facile.

RVB à Hsv:

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

Hsv vers RVB:

var hsv = new Hsv { H = 360, S = .5, L = .17 }
var rgb = hsv.to<Rgb>();
13
répondu Joe Zack 2016-11-01 14:28:34

Regardez http://richnewman.wordpress.com/hslcolor-class / qui a une excellente Classe c# pour fournir toutes les conversions nécessaires, y compris vers et depuis les couleurs du système windows.

-1
répondu Chris Wegener 2011-09-22 17:13:59