如何将整数转换为可用颜色(对于 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);
但是,这不会实现您在问题中描述的环绕颜色效果,实际上您的
int32
中的大部分变化都无法实现。值(假设您的范围从 MinValue 到 MaxValue)将应用于 alpha channel 或不透明度,这听起来不像您想要的。更新 :这里有一些应该做你需要的东西:
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));
}
d
WheelColor 中的参数意味着从 0.0 到 1.0,并将循环通过色轮(有点),当 d = 0.0 时从红色开始,当 d = 1.0 时返回红色。
关于vb.net - 将整数转换为颜色,从红色开始循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1528949/