2010-11-03 15 views

Respuesta

15

Rich Newman ha creado una clase HSLColor que se puede utilizar en lugar de System.Drawing.Color.

http://richnewman.wordpress.com/hslcolor-class/

+2

Esta clase parece funcionar * la mayor parte del tiempo *. Tengo un problema en el que tengo un color HSL (210,45,72) que es azul y se obtiene como rgb (90,62,83) que es rojo. Estoy tratando de entrar en su blog, pero casi nunca carga jajaja. – Sinaesthetic

+3

Esta clase usa el método Color.GetBrightness, por lo que presenta el espacio de color [HSB] (http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC36), no HSL. – ironic

+1

No funciona para # bbe30a y # 320ae3. Intenté solo dos valores y renuncié. – aloisdg

10

Añadir la siguiente línea a la "usando" espacios de nombres en el archivo de código:

using System.Runtime.InteropServices 

y con P/Invoke, agregue la siguiente función:

[DllImport("shlwapi.dll")] 
public static extern int ColorHLSToRGB(int H, int L, int S); 

En cualquier clase que desee en su proyecto.

Si tiene el color en tono, luminancia y saturación como números enteros, dé estos valores a esa función y el color RGB deseado se devolverá como entero. Luego use ColorTranslator.FromWin32 para traducir el color rgb devuelto como un entero a la estructura System.Drawing.Color.

Otra forma es utilizar el método de sobrecarga Color.FromArgb (Int32), para crear el color que desee como estructura System.Drawing.Color a partir de ese entero.

Otra forma es crear una instancia de ColorConverter clase, y luego llamar ConvertFrom método, y darle el número entero de color RGB devuelve desde la función ColorHLSToRGB, o llame ConvertTo método con el mismo primero argumento, pero en el segundo argumento ingrese typeof(System.Drawing.Color). A continuación, convierta el objeto devuelto a System.Drawing.Color structure type.

¡El resultado es exactamente lo que está buscando y esperando!

También puede probar otros algoritmos o formas en que puede buscar, averiguar y aprender en Internet, acerca de cómo convertir el color RGB como un número entero a System.Drawing.Color structure O cómo convertir valores HLS en tres enteros a System.Drawing.Color estructura!

+2

Un par de cosas a tener en cuenta: 'H',' L' y 'S' van de 0 a 240. Tenga en cuenta que una luminancia de 0 significa negro y 240 significa blanco, por lo que si desea un color puro (como '# F00') necesita establecer' L' en 120. También vale la pena señalar: si va a utilizar la sobrecarga 'Color.FromArgb (Int32)', el color tendrá un alfa de 0, lo que significa que ' ll ser transparente. 'ColorTranslator.FromWin32()' no tiene ese problema. – Nolonar

Cuestiones relacionadas