110,571
社区成员
发帖
与我相关
我的任务
分享
class HSB
{
public float H; //色调
public float S; //饱和度
public float B; //亮度
public HSB()
{
H = 0;
S = 1;
B = 1;
}
public HSB(HSB hsb)
{
H = hsb.H;
S = hsb.S;
B = hsb.B;
}
public HSB(Color color)
{
H = color.GetHue();
S = color.GetSaturation();
B = color.GetBrightness();
}
public override string ToString()
{
return "H:" + H + " S:" + S + " B:" + B;
}
public static HSB operator +(HSB lhs, HSB rhs)
{
HSB result = new HSB(lhs);
var h1 = result.H;
var h2 = rhs.H;
if (rhs.H - h1 > 180) h1 += 360f;
result.H = (rhs.H - h1) / 2 + h1;
if (result.H == 360f) result.H = 0f;
result.S = rhs.S;
result.B = rhs.B * 2;
return result;
}
public Color ToColor()
{
double r = 0;
double g = 0;
double b = 0;
if (S == 0)
{
r = g = b = B;
}
else
{
// the color wheel consists of 6 sectors. Figure out which sector you're in.
double sectorPos = H / 60.0;
int sectorNumber = (int)(Math.Floor(sectorPos));
// get the fractional part of the sector
double fractionalSector = sectorPos - sectorNumber;
// calculate values for the three axes of the color.
double p = B * (1.0 - S);
double q = B * (1.0 - (S * fractionalSector));
double t = B * (1.0 - (S * (1 - fractionalSector)));
// assign the fractional colors to r, g, and b based on the sector the angle is in.
switch (sectorNumber)
{
case 0:
r = B;
g = t;
b = p;
break;
case 1:
r = q;
g = B;
b = p;
break;
case 2:
r = p;
g = B;
b = t;
break;
case 3:
r = p;
g = q;
b = B;
break;
case 4:
r = t;
g = p;
b = B;
break;
case 5:
r = B;
g = p;
b = q;
break;
}
}
var red = Convert.ToInt32(r * 255);
var green = Convert.ToInt32(g * 255);
var blue = Math.Abs(Convert.ToInt32(b * 255));
return Color.FromArgb(red, green, blue);
}
}
Color color = (new HSB(Color.FromArgb(100, 100, 220)) + new HSB(Color.Tomato)).ToColor();
private void button1_Click(object sender, EventArgs e)
{
label1.ForeColor = Color.FromArgb(255, 0, 0); //红
label2.ForeColor = Color.FromArgb(0, 255, 0); //绿
int rgb1 = ParseRGB(Color.FromArgb(255, 0, 0));
int rgb2 = ParseRGB(Color.FromArgb(0, 255, 0));
int rgb3 = rgb1 + rgb2;
label3.ForeColor = RGB(rgb3); //黄
}
private Color RGB(int color)
{
int r = 0xFF & color;
int g = 0xFF00 & color;
g >>= 8;
int b = 0xFF0000 & color;
b >>= 16;
return Color.FromArgb(r, g, b);
}
private int ParseRGB(Color color)
{
return color.B << 16 | color.G << 8 | color.R;
}
class LightColor
{
Color color;
public Color Color1
{
get { return color; }
set { color = value; }
}
public LightColor() { }
public LightColor(Color color)
{
this.color = color;
}
public static LightColor operator +(LightColor lightColor1,LightColor lightColor2)
{
int red = lightColor1.color.R + lightColor2.color.R;
int green = lightColor1.color.G + lightColor2.color.G;
int blue = lightColor1.color.B + lightColor2.color.B;
int max = Math.Max(Math.Max(red, green), blue);
if (max > 255)
{
double f = 255.0 / max;
red = (int)(red * f);
green = (int)(green * f);
blue = (int)(blue * f);
}
LightColor lightColor = new LightColor(Color.FromArgb(red,green,blue));
return lightColor;
}
}
private Color AddColor(Color color, Color color_2)
{
int[] cv = new int[]{
color.R,color.G,color.B,
color_2.R,color_2.G,color_2.B,
0,0,0
};
for (int i = 0; i < 3; i++)
{
cv[i + 6] = 255 - (255 - cv[i + 0]) * (255 - cv[i + 3]) / 255;
}
return Color.FromArgb(cv[6], cv[7], cv[8]);
}