Algorithme pour Basculer Entre RVB et TSL Valeurs de Couleur
J'ai lu l'article Algorithme pour Basculer Entre RVB et TSL Valeurs de Couleur
Type RGBColor
Red As Byte
Green As Byte
Blue As Byte
End Type
Type HSBColor
Hue As Double
Saturation As Double
Brightness As Double
End Type
Function RGBToHSB(rgb As RGBColor) As HSBColor
Dim minRGB, maxRGB, Delta As Double
Dim h, s, b As Double
h = 0
minRGB = Min(Min(rgb.Red, rgb.Green), rgb.Blue)
maxRGB = Max(Max(rgb.Red, rgb.Green), rgb.Blue)
Delta = (maxRGB - minRGB)
b = maxRGB
If (maxRGB <> 0) Then
s = 255 * Delta / maxRGB
Else
s = 0
End If
If (s <> 0) Then
If rgb.Red = maxRGB Then
h = (CDbl(rgb.Green) - CDbl(rgb.Blue)) / Delta
Else
If rgb.Green = maxRGB Then
h = 2 + (CDbl(rgb.Blue) - CDbl(rgb.Red)) / Delta
Else
If rgb.Blue = maxRGB Then
h = 4 + (CDbl(rgb.Red) - CDbl(rgb.Green)) / Delta
End If
End If
End If
Else
h = -1
End If
h = h * 60
If h < 0 Then h = h + 360
RGBToHSB.Hue = h
RGBToHSB.Saturation = s * 100 / 255
RGBToHSB.Brightness = b * 100 / 255
End Function
Function HSBToRGB(hsb As HSBColor) As RGBColor
Dim maxRGB, Delta As Double
Dim h, s, b As Double
h = hsb.Hue / 60
s = hsb.Saturation * 255 / 100
b = hsb.Brightness * 255 / 100
maxRGB = b
If s = 0 Then
HSBToRGB.Red = 0
HSBToRGB.Green = 0
HSBToRGB.Blue = 0
Else
Delta = s * maxRGB / 255
If h > 3 Then
HSBToRGB.Blue = CByte(Round(maxRGB))
If h > 4 Then
HSBToRGB.Green = CByte(Round(maxRGB - Delta))
HSBToRGB.Red = CByte(Round((h - 4) * Delta)) + HSBToRGB.Green
Else
HSBToRGB.Red = CByte(Round(maxRGB - Delta))
HSBToRGB.Green = CByte(HSBToRGB.Red - Round((h - 4) * Delta))
End If
Else
If h > 1 Then
HSBToRGB.Green = CByte(Round(maxRGB))
If h > 2 Then
HSBToRGB.Red = CByte(Round(maxRGB - Delta))
HSBToRGB.Blue = CByte(Round((h - 2) * Delta)) + HSBToRGB.Red
Else
HSBToRGB.Blue = CByte(Round(maxRGB - Delta))
HSBToRGB.Red = CByte(HSBToRGB.Blue - Round((h - 2) * Delta))
End If
Else
If h > -1 Then
HSBToRGB.Red = CByte(Round(maxRGB))
If h > 0 Then
HSBToRGB.Blue = CByte(Round(maxRGB - Delta))
HSBToRGB.Green = CByte(Round(h * Delta)) + HSBToRGB.Blue
Else
HSBToRGB.Green = CByte(Round(maxRGB - Delta))
HSBToRGB.Blue = CByte(HSBToRGB.Green - Round(h * Delta))
End If
End If
End If
End If
End If
End Function
Puis il y avait quelqu'un qui a posté qu'il y avait une erreur, mais ne m'étendrai pas beaucoup
Mais je pense qu'il a besoin pour gérer lorsque h est de plus de 5, par exemple pour la couleur R:130 G:65 B:111
If h > 5 Then
HSBToRGB.Red = CByte(Round(maxRGB))
If h > 6 Then
HSBToRGB.Blue= CByte(Round(maxRGB - Delta))
HSBToRGB.Green= CByte(Round((h - 6) * Delta)) HSBToRGB.Blue
Else
HSBToRGB.Green= CByte(Round(maxRGB - Delta))
HSBToRGB.Blue = CByte(HSBToRGB.Green- Round((h - 6) * Delta))
End If
Dois-je ajouter dans ce morceau de code? Et je présume qu'il doit aller dans TSL, RVB (dans mon C# conversion)
...
if (s != 0) {
delta = s * maxRGB / 255;
if (h > 5)
rgb.Red = Convert.ToByte(Math.Round(maxRGB));
if (h > 6)
{
rgb.Green = Convert.ToByte(Math.Round(maxRGB - delta));
rgb.Blue = Convert.ToByte(rgb.Green - Math.Round((h - 6) * delta));
}
if (h > 3)
{
...
aussi, doit-il être comme ci-dessus, ou
if (h > 6) { }
else if (h > 3) { }
Vous devez vous connecter pour publier un commentaire.
En utilisant les méthodes intégrées .NET est la Couleur de l'objet est un non-starter parce que, comme plusieurs réponses soulignent, ils ne supportent pas l'inverse (la conversion d'un chromatique TSL, RVB). En outre,
Color.GetBrightness
renvoie en fait légèreté, plutôt que de luminosité/valeur. Il y a beaucoup de confusion sur les différences entre les HSB/HSV et de couleur HSL espaces en raison de leurs similitudes (Wikipédia). Je vois beaucoup de sélecteurs de couleurs qui finissent à l'aide de l'algorithme inapproprié et/ou d'un modèle.Le code d'origine me semble qu'il manque quelques scénarios possibles lorsqu'il calcule la valeur de la teinte, donné une couleur RVB. C'est un peu difficile pour moi de suivre les ajouts que vous envisagez pour le code, mais la première chose qui saute aux yeux (et que vous n'apparaissez pas à suggérer la correction), c'est que lorsque la saturation = 0, vous réglez la teinte de -1. Lorsque, plus tard, vous multipliez la teinte de 60, vous vous retrouvez avec -60, puis vous ajoutez que, pour 360 (
If h < 0 Then h = h + 360
), la production d'un résultat de 300, ce qui n'est pas correct.J'utilise le code suivant (dans VB.NET) pour convertir entre RVB et TSL (ce que j'appelle le HSV). Les résultats ont été testés très largement, et les résultats sont pratiquement identiques à ceux donnés par Photoshop sélecteur de couleur (à part de la rémunération pour les profils de couleurs). La différence majeure entre les posté code et le mien (en dehors de la partie importante qui calcule la teinte) c'est que je préfère en normalisant les valeurs RVB entre 0 et 1 pour faire les calculs, plutôt que de travailler avec l'origine des valeurs entre 0 et 255. Ceci élimine certains de l'inefficacité et de multiples conversions dans le premier code que vous avez posté, en tant que bien.
Vous n'avez pas de poste le code que vous utilisez pour convertir à partir d'un HSB (ce que j'appelle le HSV) de couleur RVB, mais voici ce que j'utilise, travailler de nouveau avec des valeurs intermédiaires que sont entre 0 et 1:
EDIT: Ce code est très similaire à celle prévue au C par Richard J. Ross III. Je traqués comme de nombreux algorithmes différents que j'ai pu trouver en ligne, a réécrit beaucoup de code empruntant le meilleur de chacun d'eux, et fait de nombreux tests pour vérifier l'exactitude des résultats. J'ai oublié de noter qui j'ai emprunté le code, que c'était juste pour une bibliothèque privée. Peut-être que la version de visual basic va aider quelqu'un qui ne veut pas faire une conversion de C. 🙂
Voici ma version sur comment faire (en C, désolé, mais ne devrait pas être difficile à convertir, il suffit de remplacer le
int *
's etdouble *
's avecout
ouref
ints, et n'utilisez pas la syntaxe de pointeur)RVB à hsb:
Si je trouve mon code en C#, je vais modifier cette réponse....
Que penser de l'utilisation de la Couleur GetBrightness, GetHue et GetSaturation méthodes?
System.Drawing.Color.GetBrightness
est en fait de la luminosité, pas de luminositéSi vous êtes en utilisant .net, pourquoi réinventer la roue?
System.Drawing.Color.GetBrightness
est en fait de la luminosité, pas de luminositéLa conversion de RVB à HSB devrait être plutôt facile à l'aide de la
Color
structure:Il ne supporte pas l'inverse, si.
System.Drawing.Color.GetBrightness
est en fait de la luminosité, pas de luminositéSolution
Vous pouvez calculer la composante de Luminosité, tout simplement, comme c'est le max de R, G et B (référence: formule pour RVB pour les VHS de l'Institut de Technologie de Rochester). Vous pouvez mettre à l'échelle cependant que vous aimez en les divisant par 255 et en multipliant le résultat par l'échelle. C'est la même chose que faire dans votre code existant:
Donc, à la fin, vous pouvez utiliser le microphone .Net des fonctions et simplement calculer votre luminosité. Plein de code (à l'exclusion de vos types):
Un peu au sujet de HSB (de même que le HSV)
De Darel Rex Finley:
Selon le La Documentation De Microsoft pour
Color.GetBrightness
:J'ai trouvé quelques références dire la MSDN utilise HSB quand il signifie HSL comme celui de la MSDN blogs (voir les commentaires). Un rapide test prouve que c'est vrai (en C#):
Il en résulte une valeur de
127
, qui est clairement HSL. Si c'était HSB la valeur doit être le max de R, G et B (c'est à dire255
).