Existe-t-il une API intégrée au framework .NET pour converting HSV to RGB? Je n'ai pas vu une méthode dans System.Drawing.Color pour cela, mais il semble surprenant qu'il n'y en aurait pas dans la plate-forme.Y a-t-il une API système C#/.NET intégrée pour HSV à RGB?
Répondre
Je ne pense pas qu'il existe une méthode faisant cela dans le framework .NET.
Découvrez Converting HSV to RGB colour using C#
Voici le code de mise en œuvre,
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;
}
Il n'y a pas une méthode intégrée pour ce faire, mais les calculs ne sont pas très complexes.
Notez également que Color GetHue(), GetSaturation() et GetBrightness() retournent des valeurs HSL, pas HSV.
Le code C# suivant convertit entre RGB et HSV en utilisant les algorithmes décrits au Wikipedia.
J'ai déjà posté cette réponse here, 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);
}
Votre ColorFromHSV peut avoir quelque chose qui ne va pas, j'essayais de faire pivoter la teinte de 180 degrés en utilisant votre code pour une couleur opposée et ça ne fonctionne pas très bien. Le code accepté donne une couleur différente qui me semble correcte. –
J'utilise votre fonction ColorToHSV, cependant. Cela semble bien fonctionner. –
@IsaacBolinger ne fonctionne pas bien avec la teinte négative, bien travaillé pour hue> = 0, mais mieux d'utiliser la teinte entre <0, 360) dans votre code. – xmedeko
Regardez http://richnewman.wordpress.com/hslcolor-class/ qui a une excellente C# classe pour fournir toutes les conversions nécessaires, y compris et à des fenêtres couleurs du système.
La question est pour HSB/V, pas HSL, qui est souvent mélangé. En fait, Microsoft lui-même l'a mal compris en désignant Color.GetBrightness() par HSB, alors qu'en réalité il s'agit de HSL. – redshift5
Il n'est pas intégré, mais il existe une bibliothèque C# open source appelée ColorMine qui facilite grandement la conversion entre les espaces colorimétriques.
Rvb à Hsv:
var rgb = new Rgb {R = 123, G = 11, B = 7};
var hsv = rgb.To<Hsv>();
Hsv rgb:
var hsv = new Hsv { H = 360, S = .5, L = .17 }
var rgb = hsv.to<Rgb>();
- 1. API multi-plateforme pour les informations système
- 2. Système CRM hébergé avec une API?
- 3. Y a-t-il une API SDK iPhone pour Twitter?
- 4. Y a-t-il une API Wikipedia?
- 5. Y a-t-il une API bing?
- 6. Y at-il une fonction JavaScript intégrée pour traiter une chaîne de temps?
- 7. Y a-t-il une API pour LinkedIn et Plaxo comme Facebook API?
- 8. Y at-il une API Java pour la recherche AJAX de Google API
- 9. changer les valeurs de couleur rgb pour représenter une valeur
- 10. Existe-t-il une API intégrée WinXP/WinXP pour modifier les paramètres régionaux (en particulier, IME)?
- 11. Pour convertir des données RGB 12 bits en données RGB 12 bits empaquetées
- 12. Y a-t-il une politique d'enregistrement intégrée pour les TFS 2008 nécessitant des commentaires?
- 13. Y a-t-il une API pour ajouter des annonces à mon application de bureau?
- 14. Y at-il une fonction intégrée pour les citations F # lisibles par l'homme?
- 15. Y a-t-il un événement API pour quand une personne change d'horloge sous Windows?
- 16. Authentification intégrée pour mysql
- 17. Système d'authentification API simple et sécurisé
- 18. Y a-t-il une enveloppe API de Robocopy?
- 19. Convertir la méthode RGB?
- 20. Extraire rgb de UIColor
- 21. Quelles API peuvent être utilisées pour afficher différents fonds d'écran sur un système à plusieurs moniteurs?
- 22. Y a-t-il une API C JSR 257 (API "Communication sans contact") disponible?
- 23. StretchDIBits semble lent, y at-il une API plus rapide?
- 24. Comment obtient-on l'heure du système en XML? Y a-t-il une méthode/fonction?
- 25. Sécurité intégrée pour plusieurs domaines?
- 26. Comment initialiser des bitmaps 48bpp à partir de RGB?
- 27. Y at-il une API en Java pour accéder aux données wikipedia?
- 28. recommande une bibliothèque/API pour décompresser le fichier en C#
- 29. Est-ce que quelqu'un sait s'il y a une API .NET pour Project Natal?
- 30. Y at-il une API pour obtenir les détails du service ferroviaire des États-Unis
Merci pour cette méthode. Bizarre que Color ait .GetHue(), .GetSaturation() et .GetBrightness(), mais pas de méthode inverse comme .fromHSB(). – MusiGenesis
En effet ... c'est une omission très étrange, imo. – jsight
Pourquoi ne pas retourner un objet Color au lieu d'utiliser * out * pour trois valeurs séparées? –