将整数转换为颜色,从红色开始并循环显示

时间:2009-10-07 00:50:12

标签: vb.net colors

如何将整数转换为可用颜色(对于PictureBox.CreateGraphics)?

颜色应从红色开始,循环到橙色,黄色等,并再次回到红色。

这是在vb.net中。如果我不能这样做,我如何使用十六进制代码而不是笔来使用PictureBox.CreateGraphics?

感谢您的帮助!

2 个答案:

答案 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)