C# C平滑彩虹褪色问题

C# C平滑彩虹褪色问题,c#,C#,因此,我试图通过向RGB添加不同的值并将标签设置为这些值,使这个具有真正平滑彩虹的文本标签褪色,但我找不到停止开始整个过程的起始值的方法! 我知道这段代码很混乱,还有一些不必要的东西,比如随机数之类的东西。但它抛出错误System.ArgumentException:“256”的值对于“红色”无效。”红色“应大于或等于0且小于或等于255。” int R = 0; int G = 0; int B = 0; private void timer2_Tick(ob

因此,我试图通过向RGB添加不同的值并将标签设置为这些值,使这个具有真正平滑彩虹的文本标签褪色,但我找不到停止开始整个过程的起始值的方法! 我知道这段代码很混乱,还有一些不必要的东西,比如随机数之类的东西。但它抛出错误System.ArgumentException:“256”的值对于“红色”无效。”红色“应大于或等于0且小于或等于255。”

    int R = 0;
    int G = 0;
    int B = 0;

    private void timer2_Tick(object sender, EventArgs e)
    {
        Random r = new Random();

        int A = r.Next(255, 255);

        R += 1;
        if (R > 250)
        {
            G += 1;
            R -= 1;
        }

        if (G > 250)
        {
            B += 1;
            G -= 1;
        }

        if (B > 250)
        {
            R += 1;
            B -= 1;
        }

        lblMarquee.ForeColor = Color.FromArgb(A, R, G, B);
    }

你在这里的代码有很多问题,所以我想我只关注这一点。至于你的彩虹配色方案,我不确定你是否走对了方向。然而,假设你是,这应该会帮助你

// never recreate the random class in your method
// always just create one
private static readonly Random _rand = new Random();

// your variables, make them byte as that's what we are dealing with
private static byte _r = 0;
private static byte _g = 0;
private static byte _b = 0;
private static byte _a = 0;

private static SomeMethod()
{

    // make your life easier with some helper methods
    void Inc(ref byte val)
      => val = (byte)(val>=255 ? 0: val++);

    void Dec(ref byte val)
       => val = (byte)(val<=0 ? 255: val--);

    // not sure why you want this
    _a = (byte)_rand.Next(255);

    _r += 1;

    // i have no idea what your logic is here, but it looks neater
    // and wont overflow, which is your problem
    // however i seriously doubt this will give you a rainbow
    if (_r > 250)
    {
       Inc(ref _g);
       Dec(ref _r);
    }

    if (_g > 250)
    {
       Inc(ref _b);
       Dec(ref _g);
    }

    if (_b > 250)
    {
       Inc(ref _r);
       Dec(ref _b);
    } 

    lblMarquee.ForeColor = Color.FromArgb(_a, _r, _g, _b);

}

使用模运算来限制值我知道这是一个很大的问题,但我对所有这些都很陌生,如果你能给我更多的澄清,甚至给我一个解决这个问题的方法,我将不胜感激,我对“模运算”一点也不了解!一旦B达到251,R开始再次计数。。。。。永远。此外,通常,在RGB颜色空间中移动并不像在HSL颜色空间中移动那样令人愉快。因此,找出一种更好的方法: