回答
我使用以下類從HSL轉換爲RGB,反之亦然。您可以從Color
構造一個ColorRGB
實例,或者簡單地施放一個。它也暴露了H
,S
,L
屬性。我在網上找到它。對原作者的歉意,我找不到參考文獻:
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();
}
}
}
以爲我會添加原始鏈接。 :) http://www.geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm – 2012-05-02 13:28:37
謝謝你 - 當我搜索代碼時找不到它。很高興我們現在可以歸因於原作者。這對我來說太聰明瞭;-) – ColinE 2012-05-02 13:30:26
鏈接已損壞,但沒有使用www:http://geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm – 2013-05-15 13:14:35
- 1. OpenCL RGB-> HSL並返回
- 2. 將RGB轉換爲HLS並返回
- 3. 將RGB從字符串轉換爲數字並返回
- 4. 將單字節轉換爲字符串並返回字節
- 5. 將字節數組轉換爲字符串並返回到C#
- 6. 將字節數組轉換爲字符串並返回
- 7. 將字符串數組轉換爲字節數組並返回
- 8. 將字節[]轉換爲字符串並返回
- 9. 通過jQuery將HSL或HSV轉換爲RGB
- 10. 將RGB轉換爲HSL以獲得更高的分辨率C++
- 11. 將hsl轉換爲hsb
- 12. 將HSL轉換爲RBG
- 13. Powershell的:HSL爲RGB
- 14. 將char數組轉換爲字節數組並再次返回
- 15. 如何使用C#將字節[]轉換爲數組(並返回)?
- 16. JavaScript將字節數組轉換爲JSON並返回
- 17. 如何將Int32的字節數據轉換爲UInt32並返回?
- 18. 將unsigned int轉換爲字節數組並返回
- 19. 如何將浮點數組轉換爲字節[]並返回?
- 20. Farbtastic HSL轉換回RGB或十六進制
- 21. 如何將字節數據轉換爲位並再次轉換回字節?
- 22. Silverlight轉換器將對象轉換爲字符串並返回
- 23. 將double(0.1)轉換爲BigRational並返回
- 24. 將記錄轉換爲proplists(並返回)
- 25. 將ushort []轉換爲byte []並返回
- 26. Netty。將HttpRequest轉換爲FrameWebSocket並返回
- 27. 將字節數組轉換回字節數組返回字節數組
- 28. 將RGB轉換爲ColorName字符串Javascript
- 29. 將字節[]轉換爲字符串,然後返回字節時出現問題
- 30. LinearRGB轉換爲/從HSL
@Matt不是重複,因爲這個問題具體詢問有關HSL,而您的鏈接是指HSV。這些不是一回事。 – 2016-01-28 10:03:35
真的,我的壞。我刪除了評論。 – Matt 2016-01-28 11:10:26