如何将整数转换为可用的颜色(对于PictureBox.CreateGraphics)?
颜色应该从红色开始,循环到橙色,黄色等,并再次回到红色.
这是在vb.net中.如果我不能这样做,我如何使用十六进制代码而不是笔使用PictureBox.CreateGraphics?
谢谢您的帮助!
您可以使用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);
Run Code Online (Sandbox Code Playgroud)
但是,这不会实现您在问题中描述的环绕颜色效果,事实上,您的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));
}
Run Code Online (Sandbox Code Playgroud)
dWheelColor中的参数意味着从0.0到1.0,并将循环通过色轮(排序),当d = 0.0时从红色开始,当d = 1.0时返回红色.
| 归档时间: |
|
| 查看次数: |
13678 次 |
| 最近记录: |