?? hsl.cs
字號:
using System;
using System.Drawing;
namespace PhotoSprite.ColorSpace
{
/// <summary>
/// HSL 色彩空間結(jié)構(gòu)體
/// </summary>
public struct HSL
{
float h, s, l;
/// <summary>
/// 獲取或設(shè)置色調(diào)[0, 360]
/// </summary>
public float Hue
{
get
{
return h;
}
set
{
h = (float)((int)(value) % 360);
}
}
/// <summary>
/// 獲取或設(shè)置飽和度[0, 1]
/// </summary>
public float Saturation
{
get
{
return s;
}
set
{
s = value;
if (s < 0.0) s = 0.0f;
if (s > 1.0) s = 1.0f;
}
}
/// <summary>
/// 獲取或設(shè)置亮度[0, 1]
/// </summary>
public float Luminance
{
get
{
return l;
}
set
{
l = value;
if (l < 0.0f) l = 0.0f;
if (l > 1.0f) l = 1.0f;
}
}
public override bool Equals(object obj)
{
return this == (HSL)obj;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
/// <summary>
/// 判斷 HSL 結(jié)構(gòu)體是否相等
/// </summary>
/// <param name="lHsl">HSL 結(jié)構(gòu)體 1</param>
/// <param name="rHsl">HSL 結(jié)構(gòu)體 2</param>
/// <returns></returns>
public static bool operator ==(HSL lHsl, HSL rHsl)
{
if ((lHsl.Hue == rHsl.Hue) &&
(lHsl.Saturation == rHsl.Saturation) &&
(lHsl.Luminance == rHsl.Luminance))
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 判斷 HSL 結(jié)構(gòu)體是否不相等
/// </summary>
/// <param name="lHsl">HSL 結(jié)構(gòu)體 1</param>
/// <param name="rHsl">HSL 結(jié)構(gòu)體 2</param>
/// <returns></returns>
public static bool operator !=(HSL lHsl, HSL rHsl)
{
return !(lHsl == rHsl);
}
/// <summary>
/// 根據(jù) (hue, saturation, luminance) 分量建立 PhotoSprite.ColorSpace.HSL 結(jié)構(gòu)體
/// </summary>
/// <param name="hue">色調(diào)[0, 360]</param>
/// <param name="saturation">飽和度[0, 1]</param>
/// <param name="luminance">亮度[0, 1]</param>
/// <returns></returns>
public static HSL FromHsl(float hue, float saturation, float luminance)
{
HSL hsl = new HSL();
hsl.Hue = hue;
hsl.Saturation = saturation;
hsl.Luminance = luminance;
return hsl;
} // end of FromHsl
/// <summary>
/// 根據(jù) Color 結(jié)構(gòu)體建立 PhotoSprite.ColorSpace.HSL 結(jié)構(gòu)體
/// </summary>
/// <param name="color">RGB 顏色結(jié)構(gòu)體</param>
/// <returns></returns>
public static HSL FromColor(Color color)
{
HSL hsl = new HSL();
hsl.Hue = color.GetHue();
hsl.Saturation = color.GetSaturation();
hsl.Luminance = color.GetBrightness();
return hsl;
} // end of FromColor
/// <summary>
/// 根據(jù) (red, green, blue) 顏色分量建立 PhotoSprite.ColorSpace.HSL 結(jié)構(gòu)體
/// </summary>
/// <param name="red">red 分量</param>
/// <param name="green">green 分量</param>
/// <param name="blue">blue 分量</param>
/// <returns></returns>
public static HSL FromRgb(byte red, byte green, byte blue)
{
return FromColor(Color.FromArgb(red, green, blue));
} // end of FromRgb
/// <summary>
/// 獲取 RGB 顏色值
/// </summary>
/// <returns></returns>
public Color ToRgb()
{
double r = 0, g = 0, b = 0;
double t1, t2;
double normalisedH = h / 360.0;
if (l == 0)
{
r = g = b = 0;
}
else
{
if (s == 0)
{
r = g = b = l;
}
else
{
t2 = ((l <= 0.5) ? l * (1.0 + s) : l + s - l * s);
t1 = 2.0 * l - t2;
double[] T3 = new double[] {
normalisedH + 1.0 / 3.0,
normalisedH,
normalisedH - 1.0 / 3.0 };
double[] C = new double[3];
for (int i = 0; i < 3; i++)
{
if (T3[i] < 0) T3[i] += 1.0;
if (T3[i] > 1) T3[i] -= 1.0;
if (6.0 * T3[i] < 1.0)
C[i] = t1 + (t2 - t1) * T3[i] * 6.0;
else if (2.0 * T3[i] < 1.0)
C[i] = t2;
else if (3.0 * T3[i] < 2.0)
C[i] = (t1 + (t2 - t1) * ((2.0 / 3.0) - T3[i]) * 6.0);
else
C[i] = t1;
} // i
r = C[0];
g = C[1];
b = C[2];
} // s==0
} // l==0
return Color.FromArgb((int)(255 * r), (int)(255 * g), (int)(255 * b));
} // end of ToRgb
/// <summary>
/// 獲取 RGB 結(jié)構(gòu)中 red 分量值
/// </summary>
/// <returns></returns>
public byte GetRed()
{
return (byte)ToRgb().R;
}
/// <summary>
/// 獲取 RGB 結(jié)構(gòu)中 green 分量值
/// </summary>
/// <returns></returns>
public byte GetGreen()
{
return (byte)ToRgb().G;
}
/// <summary>
/// 獲取 RGB 結(jié)構(gòu)中 blue 分量值
/// </summary>
/// <returns></returns>
public byte GetBlue()
{
return (byte)ToRgb().B;
}
} // end of class HSL
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -