¿Qué herramientas se utilizan para trabajar con colores HSL en .net?cómo usar HSL en Asp.net
Respuesta
La estructura de color proporciona tres métodos: GetHue, GetSaturation y GetBrightness.
Bob Powell escribió un interesting piece on this hace varios años.
Nota histórica extraña - "HSL" (y el "HSV" relacionado) son una de las muchas cosas que se originan en el Centro de Investigación de Palo Alto (PARC) de Xerox en los años 70, cortesía de Alvy Ray Smith.
Esta clase ColorRGB proporciona formas de obtener y establecer HSL, junto con conversiones implícitas hacia y desde System.Drawing.Color. Se basa en un excelente ejemplo de GeekMonkey.com.
using System;
using System.Drawing;
namespace RMA.Drawing
{
public class ColorRGB
{
public byte R;
public byte G;
public byte B;
public byte A;
public ColorRGB()
{
R = 255;
G = 255;
B = 255;
A = 255;
}
public ColorRGB(Color value)
{
this.R = value.R;
this.G = value.G;
this.B = value.B;
this.A = value.A;
}
public static implicit operator Color(ColorRGB rgb)
{
Color c = Color.FromArgb(rgb.A, rgb.R, rgb.G, rgb.B);
return c;
}
public static explicit operator ColorRGB(Color c)
{
return new ColorRGB(c);
}
// Given H,S,L in range of 0-1
// Returns a Color (RGB struct) in range of 0-255
public static ColorRGB FromHSL(double H, double S, double L)
{
return FromHSLA(H, S, L, 1.0);
}
// Given H,S,L,A in range of 0-1
// Returns a Color (RGB struct) in range of 0-255
public static ColorRGB FromHSLA(double H, double S, double L, double A)
{
double v;
double r, g, b;
if (A > 1.0)
A = 1.0;
r = L; // default to gray
g = L;
b = L;
v = (L <= 0.5) ? (L * (1.0 + S)) : (L + S - L * S);
if (v > 0)
{
double m;
double sv;
int sextant;
double fract, vsf, mid1, mid2;
m = L + L - v;
sv = (v - m)/v;
H *= 6.0;
sextant = (int)H;
fract = H - sextant;
vsf = v * sv * fract;
mid1 = m + vsf;
mid2 = v - vsf;
switch (sextant)
{
case 0:
r = v;
g = mid1;
b = m;
break;
case 1:
r = mid2;
g = v;
b = m;
break;
case 2:
r = m;
g = v;
b = mid1;
break;
case 3:
r = m;
g = mid2;
b = v;
break;
case 4:
r = mid1;
g = m;
b = v;
break;
case 5:
r = v;
g = m;
b = mid2;
break;
}
}
ColorRGB rgb = new ColorRGB();
rgb.R = Convert.ToByte(r * 255.0f);
rgb.G = Convert.ToByte(g * 255.0f);
rgb.B = Convert.ToByte(b * 255.0f);
rgb.A = Convert.ToByte(A * 255.0f);
return rgb;
}
// Hue in range from 0.0 to 1.0
public float H
{
get
{
// Use System.Drawing.Color.GetHue, but divide by 360.0F
// because System.Drawing.Color returns hue in degrees (0 - 360)
// rather than a number between 0 and 1.
return ((Color)this).GetHue()/360.0F;
}
}
// Saturation in range 0.0 - 1.0
public float S
{
get
{
return ((Color)this).GetSaturation();
}
}
// Lightness in range 0.0 - 1.0
public float L
{
get
{
return ((Color)this).GetBrightness();
}
}
}
}
Your FromHSLA no maneja el caso de h = 1.0. –
Actualicé el código; la sentencia switch ahora maneja h = 1.0 –
No, ha corregido el pinzamiento alfa. El problema es que Hue puede ser 1.0, lo que da un valor sextante de 6, que no se maneja en la declaración 'case'. –
Además de la respuesta de secretGeek, para obtener un color de valores HSL (o viceversa), también se puede utilizar estas funciones llamadas nativas (código de ejemplo en Visual Basic):
Public Declare Sub ColorRGBToHLS Lib "shlwapi.dll" _
(ByVal clrRGB As UInteger, _
ByRef pwHue As Short, _
ByRef pwLuminance As Short, _
ByRef pwSaturation As Short)
Public Declare Function ColorHLSToRGB Lib "shlwapi.dll" _
(ByVal wHue As Short, _
ByVal wLuminance As Short, _
ByVal wSaturation As Short) As UInteger
(usando ColorTranslator.ToWin32
y ColorTranslator.FromWin32
al pasar/recibir el argumento de color/resultado)
- 1. ¿Cómo puedo usar el espacio de color HSL en Java?
- 2. Ajustaciones de imagen HSL en la GPU
- 3. Valor RGB para el convertidor HSL
- 4. Cómo dar valor de color HSL a un elemento SVG
- 5. Usar DisplayNameAttribute en ASP.NET
- 6. Cómo usar los archivos GZIP en Asp.net?
- 7. Cómo usar Console.WriteLine en ASP.Net MVC 3
- 8. Cómo usar HTTPS en una aplicación ASP.Net
- 9. ¿Cómo usar el perfil en ASP.NET?
- 10. Cómo usar Quartz.net con ASP.NET
- 11. Usar membresía ASP.NET en ServiceStack
- 12. En CSS, ¿los valores de HSL pueden ser flotantes?
- 13. ¿Cómo usar Crystal Reports con ASP.NET?
- 14. ¿Cómo puedo usar Backbone.js con ASP.Net MVC?
- 15. Cómo usar ajax con asp.net webforms
- 16. cómo usar el gráfico de velas en Silverlight en asp.net
- 17. Cómo usar mensajes localizados en el archivo javascript en asp.net
- 18. ¿Por qué no funciona este código Javascript RGB a HSL?
- 19. ¿Cómo puedo verificar si mi navegador admite colores HSL en Javascript?
- 20. ¿Vale la pena usar Debug.Assert en ASP.NET?
- 21. Cómo usar un control subclasificado en una página ASP.NET?
- 22. Cómo usar el SMTP de Gmail en el formulario ASP.NET
- 23. Cómo usar flot con jQuery en ASP.NET MVC?
- 24. ASP.NET MVC: ¿Cómo usar páginas HTML estáticas en aplicaciones MVC?
- 25. Cómo usar Console.WriteLine en ASP.NET (C#) durante la depuración?
- 26. cómo usar múltiples AdditionalFields en la validación remota - asp.net mvc
- 27. cómo comenzar a usar openID en un proyecto asp.net mvc3?
- 28. Cómo concatenar texto al usar la expresión Bind en asp.net
- 29. Usar la membresía ASP.NET en PHP
- 30. Qué usar para la membresía en ASP.NET
El código de Bob Powell es realmente útil. Desde entonces lo he usado en mis propias cosas y lo he convertido para proporcionar métodos de extensión en la clase System.Windows.Media.Color. –
El enlace a http://www.bobpowell.net/RGBHSB.htm es un enlace inactivo –
Gracias Derek, lo actualicé con un enlace a la copia del artículo de archive.org. –