Pregunta

¿Alguien sabe de una manera de conseguir un color HSL de linearRGB (no un color sRGB)? He visto un montón de sRGB <-> conversiones HSL, pero nada para linearRGB <-> HSL. No estoy seguro si es fundementally la misma conversión con ajustes menores, pero le agradecería alguna idea de que alguien pueda tener sobre esto.

Linear RGB no es el mismo que linealizar sRGB (que está teniendo [0255] y por lo que es [0,1]). transformación lineal RGB desde / a sRGB es en http://en.wikipedia.org/wiki/SRGB. En VBA, esto se expresaría (teniendo en valores sRGB linealizadas [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

He intentado el envío de los valores RGB lineal a rutinas RGB_to_HSL estándar y de vuelta hacia fuera de HSL_to_RGB, pero no funciona. Tal vez porque HSL actual <-> RGB algoritmos representan para la corrección gamma y RGB lineal no se corrige gamma - No sé exactamente. He visto casi no hay referencias que esto se puede hacer, a excepción de dos:

  1. Una referencia en http://en.wikipedia.org/wiki/HSL_and_HSV#cite_note-9 (Numerados punto 10).
  2. Una referencia en un código abierto proyecto Grafx2 @ http://code.google.com/p/grafx2/ temas / detalle? id = 63 # c22 en el que el contribuyente declara que que ha hecho lineal RGB <-> HSL conversión y proporciona algo de código C en un archivo adjunto a su comentario en un archivo .diff (Que en realidad no puedo leer :()

Mi intención es:

  1. enviar desde sRGB (por ejemplo, FF99FF (R=255, G=153, B=255)) a RGB lineal (R=1.0, G=0.318546778125092, B=1.0)
    • utilizando el código de seguridad (por ejemplo, el G = 153 se obtendrían en Linear RGB de sRGB_to_linearRGB(153 / 255))
  2. para HSL
  3. modificar / modular la saturación por 350%
  4. enviar de vuelta de HSL-> Lineal RGB-> sRGB, el resultado sería FF19FF (R=255, G=25, B=255).

Uso de funciones disponibles de .NET, tales como .getHue de un System.Drawing.Color no funciona en cualquier espacio sRGB por encima de 100% de modulación de cualquier valor HSL, de ahí la necesidad de Linear RGB que se enviará en lugar de sRGB.

¿Fue útil?

Solución

No tiene mucho sentido para convertir a RGB lineal, ya HSL se define en términos de valores codificados gamma. En su lugar, escriba su propia sRGB función de conversión a HSL, modular la saturación con esos valores (permitiendo potencialmente fuera de la gama valores de saturación), y luego volver a convertir a sRGB, intensidades que están fuera de rango sRGB sujeción (o no permitir cambios de saturación que no puede ser codificado en sRGB).

Otros consejos

El System.Windows.Media.Color clase permite obtener o establecer scRGB través ScA, SCR, ScG, propiedades SCB, o RGB a través de propiedades a, R, G, B.

Por lo que podría convertir RGB a HSL, manipular que, a continuación, convertir de nuevo a RGB y almacenar en una instancia de color. A continuación, puede leer las propiedades convertidos scRGB.

No es ideal, y podría implicar una cierta pérdida de información. Pero es una opción!

De acuerdo con su comentario aquí , el problema no es haciendo la conversión de forma incorrecta; es que está realizando conversiones sucesivas en los valores cuantificados. En otras palabras, usted está tomando el resultado de sRGB => RGB => HSL => HSL => RGB => sRGB y el uso que, en las operaciones de color posteriores. La forma más sencilla de mantener la precisión es mantener siempre en torno al valor original RGB y se acumulan los cambios en el espacio HSL que desea aplicar. De esa manera, siempre se están aplicando las operaciones en el espacio HSL al color original y no tiene que preocuparse por el procesamiento de valores cuantificados en repetidas ocasiones.

este ayudar? Hay una gran cantidad de enlaces de interés en esa pregunta, tal vez algo que funciona en su caso, también ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top