如何将整数转换为可用颜色(对于PictureBox.CreateGraphics)?
颜色应从红色开始,循环到橙色,黄色等,并再次回到红色。
这是在vb.net中。如果我不能这样做,我如何使用十六进制代码而不是笔来使用PictureBox.CreateGraphics?
感谢您的帮助!
答案 0 :(得分:9)
您可以使用HSB(色相,饱和度,亮度)颜色代替RGB颜色。 .Net可以自动将RGB颜色转换为HSB(使用Color.GetHue,.GetSaturation和.GetBrightness方法),但不会转向另一个方向。以下是处理将HSB颜色转换为RGB的代码示例:
http://splinter.com.au/blog/?p=29
(此代码示例使用“V”代替“B”,可能代表“值”而不是“亮度”)。
使用HSB颜色的优点是Hue参数的范围从0到360,并且可以解释为色轮上的位置,因此值很好地从360回到0。为了您的目的,您可以创建将饱和度和亮度值设置为1.0(最大值),然后改变色调值以创建不同的光谱颜色。
关于您的具体问题(以及详细说明鲁本斯的回答),您可以从任何int32
值创建颜色,如下所示:
int i = 4837429;
Color color = Color.FromArgb(i);
但是,这不会实现您在问题中描述的环绕色效果,实际上int32
值的大部分变化(假设您从MinValue到MaxValue的范围)将会应用于Alpha通道或不透明度,这听起来不像你想要的那样。
更新:这里应该做您需要的事情:
private const double ONE_SIXTH =
0.16666666666666666666666666666667;
private const double ONE_THIRD =
0.33333333333333333333333333333333;
private const double TWO_THIRDS =
0.66666666666666666666666666666667;
private const double FIVE_SIXTHS =
0.83333333333333333333333333333333;
public Color WheelColor(double d)
{
if ((d < 0.0) || (d > 1.0))
{
throw new ArgumentOutOfRangeException("d",
d, "d must be between 0.0 and 1.0, inclusive");
}
double R = 1;
double G = 1;
double B = 1;
if (d < ONE_SIXTH)
{
G = d / ONE_SIXTH;
B = 0;
}
else if (d < ONE_THIRD)
{
R = 1 - ((d - ONE_SIXTH) / ONE_SIXTH);
B = 0;
}
else if (d < 0.5)
{
R = 0;
B = (d - ONE_THIRD) / ONE_SIXTH;
}
else if (d < TWO_THIRDS)
{
R = 0;
G = 1 - ((d - 0.5) / ONE_SIXTH);
}
else if (d < FIVE_SIXTHS)
{
R = (d - TWO_THIRDS) / ONE_SIXTH;
G = 0;
}
else
{
B = 1 - ((d - FIVE_SIXTHS) / ONE_SIXTH);
G = 0;
}
return Color.FromArgb((int)(R * 255),
(int)(G * 255), (int)(B * 255));
}
WheelColor中的d
参数意味着从0.0到1.0,并将循环通过色轮(排序),当d = 0.0时从红色开始,当d = 1.0时返回红色。
答案 1 :(得分:3)