RGB byte
어레이를 HSL float
어레이로 변환하고 다시 변환하는 알고리즘이 있습니까?RGB 바이트를 HSL로 변환 한 후 다시 표시 하시겠습니까?
나는 here을 찾았지만 버그가있는 것으로 보입니다.
RGB byte
어레이를 HSL float
어레이로 변환하고 다시 변환하는 알고리즘이 있습니까?RGB 바이트를 HSL로 변환 한 후 다시 표시 하시겠습니까?
나는 here을 찾았지만 버그가있는 것으로 보입니다.
다음 클래스를 사용하여 HSL에서 RGB로 또는 그 반대로 변환합니다. Color
에서 ColorRGB
인스턴스를 만들거나 간단히 인스턴스를 생성 할 수 있습니다. 그것은 H
, S
, L
속성을 노출합니다. 나는 인터넷에서 그것을 발견했다. 귀하의 링크가 HSV를 의미하는 반면이 질문은 특히, HSL에 대한 요구로 중복
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 –
감사합니다. 코드를 검색 할 때 찾지 못했습니다. 다행히 원저자의 성격을 알 수 있습니다. 그것은 나에게 너무 영리합니다 ;-) – ColinE
링크가 끊어졌지만 www가없이 작동합니다. http://geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm –
@ 매트되지 않음 : 원래 작성자에게 사과, 내가 참조를 찾을 수 없습니다. 이것들은 같은 것이 아닙니다. –
사실, 나쁘다. 나는 코멘트를 삭제했다. – Matt