Question

Quelqu'un sait-il d'une façon d'obtenir HSL d'une couleur linearRGB (pas une couleur sRGB)? Je l'ai vu beaucoup de sRGB <-> conversions HSL, mais rien pour linearRGB <-> HSL. Je ne sais pas si elle est fundementally la même conversion avec quelques réglages mineurs, mais je serais reconnaissant de toute personne de connaissance peut avoir sur ce sujet.

RVB linéaire n'est pas la même que celle linéariser sRGB (qui prend [0255] et d'en faire [0,1]). transformation linéaire RGB à partir de / vers sRGB est à http://en.wikipedia.org/wiki/SRGB. Dans VBA, cela se traduirait par (en prenant en linéarisées valeurs sRGB [0,1]):

Public Function sRGB_to_linearRGB(value As Double)
   If value < 0# Then
      sRGB_to_linearRGB = 0#
      Exit Function
   End If
   If value <= 0.04045 Then
      sRGB_to_linearRGB = value / 12.92
      Exit Function
   End If
   If value <= 1# Then
      sRGB_to_linearRGB = ((value + 0.055) / 1.055) ^ 2.4
      Exit Function
   End If
   sRGB_to_linearRGB = 1#
End Function

Public Function linearRGB_to_sRGB(value As Double)
   If value < 0# Then
      linearRGB_to_sRGB = 0#
      Exit Function
   End If
   If value <= 0.0031308 Then
      linearRGB_to_sRGB = value * 12.92
      Exit Function
   End If
   If value < 1# Then
      linearRGB_to_sRGB = 1.055 * (value ^ (1# / 2.4)) - 0.055
      Exit Function
   End If
   linearRGB_to_sRGB = 1#
End Function

Je l'ai essayé d'envoyer des valeurs RVB linéaire aux routines standard RGB_to_HSL et retour à partir HSL_to_RGB, mais il ne fonctionne pas. Peut-être parce que HSL courant <-> algorithmes RVB représentent la correction gamma et linéaire RVB n'est pas corrigée en gamma - Je ne sais pas exactement. Je l'ai vu presque aucune référence que cela peut être fait, sauf deux:

  1. Une référence http://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9 (Article numéroté 10).
  2. Une référence sur une source ouverte projet GrafX2 @ http://code.google.com/p/grafx2/ questions / détails? id = 63 # c22 dans lequel le contributeur affirme que il a fait linéaire RGB <-> HSL conversion et fournit un code C dans une pièce jointe à son commentaire dans un fichier .diff (Que je ne peux pas lire vraiment :()

Mon intention est de:

  1. envoyer de sRGB (par exemple, FF99FF (R=255, G=153, B=255)) pour RVB linéaire (R=1.0, G=0.318546778125092, B=1.0)
    • en utilisant le code ci-dessus (par exemple, G = 153 serait obtenu en Linear RVB de sRGB_to_linearRGB(153 / 255))
  2. HSL
  3. modifier / moduler la saturation par 350%
  4. Reculer de HSL-> Linear RVB-> sRGB, le résultat serait FF19FF (R=255, G=25, B=255).

Utilisation de fonctions disponibles à partir de .NET, comme .getHue d'un System.Drawing.Color ne fonctionne pas dans un espace sRGB ci-dessus modulation de 100% d'une valeur de HSL, d'où la nécessité de RVB linéaire à envoyer au lieu de sRGB.

Était-ce utile?

La solution

Il ne fait pas beaucoup de sens pour convertir en RGB linéaire, puisque HSL est défini en termes de valeurs codées gamma. Au lieu de cela, écrire votre propre fonction convert sRGB pour HSL, moduler la saturation avec ces valeurs (ce qui pourrait permettre hors gamut valeurs de saturation), puis reconvertir en sRGB, serrage des intensités qui sont hors de portée sRGB (ou refuser les changements de saturation ne peut pas être codé en sRGB).

Autres conseils

Le System.Windows.Media.Color classe vous permet d'obtenir ou de définir scRGB via les propriétés ScA, scr, ScG, Scb ou RGB via a, R, G, B propriétés.

Vous pouvez convertir RVB à HSL, manipuler que, puis reconvertir en RGB et stocker dans une instance de couleur. Vous pouvez ensuite lire les propriétés converties scRGB.

Pas idéal, et pourrait entraîner une perte d'information. Mais il est une option!

D'après votre commentaire , votre question n'est pas faire la conversion de manière incorrecte; c'est que vous effectuez des conversions successives sur des valeurs quantifiées. En d'autres termes, vous prenez le résultat de sRGB => RVB => HSL => HSL => RVB => sRGB et à l'aide que dans les opérations de couleur suivantes. La façon la plus simple de maintenir la précision est de toujours garder autour de la valeur RVB d'origine et d'accumuler les changements dans l'espace HSL que vous souhaitez appliquer. De cette façon, vous postulez toujours les opérations spatiales de HSL à la couleur d'origine et vous n'avez pas à vous soucier de traiter à plusieurs reprises des valeurs quantifiées.

Est-ce que cette aide ? Il y a beaucoup de liens intéressants dans cette question, peut-être quelque chose qui fonctionne dans votre cas aussi ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top