什麼工具用於處理.net中的HSL顏色?如何在Asp.net中使用HSL
17
A
回答
13
顏色結構提供了三種方法:GetHue,GetSaturation和GetBrightness。
鮑勃鮑威爾幾年前寫了interesting piece on this。
奇怪的歷史說明 - 「HSL」(以及相關的「HSV」)是在70年代,禮貌的Alvy Ray Smith從施樂公司的帕洛阿爾託研究中心(PARC)發起的許多事情之一。
14
這個ColorRGB類提供了獲取和設置HSL的方法,以及向System.Drawing.Color和從System.Drawing.Color的隱式轉換。它基於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();
}
}
}
}
6
除了secretGeek的回答,擺脫HSL值的顏色(反之亦然),您也可以使用這些本地函數調用(在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
(在傳遞/接收顏色參數/結果時使用ColorTranslator.ToWin32
和ColorTranslator.FromWin32
)
相關問題
- 1. 如何使用HSL到RGB轉換功能
- 2. CSS:如何僅使用hsl顏色更改一個值
- 3. 如何使用RGB或HSL顯示HWB/HSB/CMYK通道
- 4. 如何通過HSL顏色着色?
- 5. 用HSL + GD替換色調?
- 6. 在CSS中,HSL值可以浮動嗎?
- 7. 如何在asp.net使用CSS
- 8. 如何使用focus();在asp.net
- 9. 如何在asp.net使用C#
- 10. 如何使用JavaScript在asp.net
- 11. 如何在ASP.NET中使用原生dll?
- 12. 如何在ASP.NET C#中使用if(IsPostBack)#
- 13. 如何在asp.net gridview中使用jquery tablesorter?
- 14. 如何在Asp.net 4.0中使用ReactJS?
- 15. 如何在ASP.NET 5中使用JavaScriptSerializer?
- 16. 如何在ASP.NET MVC中使用標識
- 17. 如何在ASP.net中使用Repeater
- 18. 如何在asp.net中使用Resouce.txt
- 19. 如何在ASP.NET Web API中使用Ninject?
- 20. 如何在asp.net中使用<% %>?
- 21. 如何在asp.net中使用breezeJS webforms
- 22. 如何在Asp.Net中使用Session MVC3
- 23. 如何在Asp.net中使用Oracle
- 24. 如何在asp.net中使用kannada字體?
- 25. 如何在asp.net mvc3中使用緩存?
- 26. 如何在ASP.NET中使用Dwolla?
- 27. 如何在asp.net c#中使用datalist?
- 28. 如何在ASP.net中使用ADO.net(SqlConnection)MVC3
- 29. 如何在asp.net中使用formsauthenticationticket類mvc
- 30. 如何在asp.net 3.5中使用Json?
鮑勃鮑威爾的代碼的確很方便。我已經使用它在我自己的東西,並將其轉換爲在System.Windows.Media.Color類提供擴展方法。 – 2009-11-26 17:34:24
鏈接http://www.bobpowell.net/RGBHSB.htm是一個無效鏈接 – 2014-05-30 03:14:01