2010-11-03 11 views

risposta

15

Rich Newman ha creato una classe HSLColor che può essere utilizzata al posto di System.Drawing.Color.

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

+2

Questa classe sembra funzionare * la maggior parte del tempo *. Sto avendo un problema in cui ho un colore HSL (210,45,72) che è un blu che viene emesso come rgb (90,62,83) che è un rosso. Sto cercando di ottenere sul suo blog ma non carica quasi mai lol. – Sinaesthetic

+3

Questa classe utilizza Color.GetBrightness Method, quindi presenta effettivamente lo spazio colore [HSB] (http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC36), non HSL. – ironic

+1

Non funziona per # bbe30a e # 320ae3. Ho provato solo due valori e fatto fuoco. – aloisdg

10

Aggiungere la seguente riga sotto al "usando" namespace nel file di codice:

using System.Runtime.InteropServices 

e con P/Invoke, aggiungere la seguente funzione:

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

In qualsiasi classe desideri nel tuo progetto.

Se si dispone del colore in tonalità, luminanza e saturazione come numeri interi, fornire questi valori a tale funzione e il colore RGB desiderato verrà restituito come intero. Quindi utilizzare ColorTranslator.FromWin32 per tradurre il colore rgb restituito come intero nella struttura System.Drawing.Color.

Un altro modo consiste nell'utilizzare il metodo di sovraccarico Color.FromArgb (Int32), per creare il colore desiderato come struttura System.Drawing.Color da quello intero.

altro modo è creare un'istanza di ColorConverter classe, e quindi chiamare ConvertFrom metodo, e dargli il numero intero colore RGB restituito dalla funzione ColorHLSToRGB, o chiamare ConvertTo metodo con lo stesso primo argomento, ma nel secondo argomento input typeof(System.Drawing.Color). Quindi converti l'oggetto restituito nel tipo di struttura System.Drawing.Color.

Il risultato è esattamente quello che stai cercando e atteso!

È inoltre possibile provare altri algoritmi o metodi che è possibile cercare, scoprire e imparare su Internet, su come convertire il colore RGB come intero in struttura System.Drawing.Color OPPURE come convertire i valori HLS come tre interi in Struttura System.Drawing.Color!

+2

Un paio di cose da notare: 'H',' L' e 'S' vanno da 0 a 240. Ricorda che una luminanza di 0 significa nero e 240 significa bianco, quindi se vuoi un colore puro (come '# F00') è necessario impostare' L' su 120. Vale anche la pena notare: se si sta usando il sovraccarico 'Color.FromArgb (Int32)', il colore avrà un alfa di 0, il che significa che ' sarò trasparente 'ColorTranslator.FromWin32()' non ha questo problema. – Nolonar

Problemi correlati