2

I need to fill a rectangle with a black to white (transparent) gradient. However, I could only find a GradientBrush class and all examples I found showed smooth transition and I want sharp bars. That's what I need:

screenshot

pmichna
  • 4,800
  • 13
  • 53
  • 90

2 Answers2

5

You need to average the colors between your start color and your end color. Here is a routine that does all that, using an averaging formula found here: Generate Color Gradient in C#

private void PaintGradientBars(Graphics g, Rectangle r, 
                               Color startColor, Color endColor, int numBars) {
  int rMin = startColor.R;
  int gMin = startColor.G;
  int bMin = startColor.B;
  int rMax = endColor.R;
  int gMax = endColor.G;
  int bMax = endColor.B;
  int left = 0;

  for (int i = 0; i < numBars; i++) {
    int rAvg = rMin + (int)((rMax - rMin) * i / numBars);
    int gAvg = gMin + (int)((gMax - gMin) * i / numBars);
    int bAvg = bMin + (int)((bMax - bMin) * i / numBars);
    Color useColor = Color.FromArgb(rAvg, gAvg, bAvg);

    int width = (r.Width - left) / (numBars - i);
    using (SolidBrush br = new SolidBrush(useColor)) {
      g.FillRectangle(br, new Rectangle(left, 0, width, r.Height));
    }
    left += width;
  }
}

Then you make a simple call:

private void panel1_Paint(object sender, PaintEventArgs e) {
  PaintGradientBars(e.Graphics, panel1.ClientRectangle,
                    Color.Blue, Color.Green, 5);
}

Resulting in:

enter image description here

Community
  • 1
  • 1
LarsTech
  • 80,625
  • 14
  • 153
  • 225
2

in this code i use picturebox, play with 'k' and 'i'

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        int k = 20;
        Color mycolor = new Color();
        for (int i = 0; i < 10; i++)
        {
            mycolor = Color.FromArgb(i * k, i * k, i * k);
            SolidBrush mybrash = new SolidBrush(mycolor);
            e.Graphics.FillRectangle((Brush)mybrash, 0 + i * k, 0, k, k);
        }
    }

Good luck!

Likurg
  • 2,742
  • 17
  • 22