用三种颜色的渐变填充面板

我正在开发项目,而且我必须使用C#做颜色select器。

所以我决定在Win Forms App中这个背景是一个Panel。

背景应具有rgb中的三种颜色的渐变:红色(0 – 255),蓝色(0 – 255)和绿色= 0。

gu0oJ.png

但是我找不到有关我应该用什么的信息。

我试图写一些代码,这是我所做的。

{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { panel1.Paint += new PaintEventHandler(panel1_Paint); panel1.Refresh(); } private void panel1_Paint(object sender, PaintEventArgs e) { Point startPoint = new Point(0, 0); Point endPoint = new Point(150, 150); LinearGradientBrush lgb = new LinearGradientBrush(startPoint, endPoint, Color.FromArgb(255, 255, 0, 0), Color.FromArgb(255, 255, 255, 0)); Graphics g = e.Graphics; g.FillRectangle(lgb, 0, 0, 150, 150); // g.DrawLine(new Pen(Color.Yellow, 1.5f), startPoint, endPoint); } } 

}

现在我有了这个梯度的面板

ORnzf.png

我应该用什么来获得第一张照片的渐变?

第二个问题:点击这个背景后我该怎么做才能得到像素的颜色?

以下是在Paint事件中使用多色LinearGradientBrush的示例:

 LinearGradientBrush linearGradientBrush = new LinearGradientBrush(panel4.ClientRectangle, Color.Red, Color.Yellow, 45); ColorBlend cblend = new ColorBlend(3); cblend.Colors = new Color[3] { Color.Red, Color.Yellow, Color.Green }; cblend.Positions = new float[3] { 0f, 0.5f, 1f }; linearGradientBrush.InterpolationColors = cblend; e.Graphics.FillRectangle(linearGradientBrush, panel4.ClientRectangle); 

在这里输入图像描述

您可以自由改变颜色的数量,angular度或停止点的传播。 只要确保你总是有相同数量的颜色和停止点,让他们从0开始,并在1结束。

构造函数中的颜色被忽略,btw ..

要获得点击的颜色,您可以编写MouseClick

 Color clickedColor = Color.Empty; private void panel4_MouseClick(object sender, MouseEventArgs e) { using (Bitmap bmp = new Bitmap( panel4.ClientSize.Width, panel4.ClientSize.Height)) { panel4.DrawToBitmap(bmp,panel4.ClientRectangle); clickedColor = bmp.GetPixel(eX, eY); } } 

如果你想捕捉许多点击,最好将Bitmap保存在一个类variables中,而不是一直重新创build。将其设置为面板的BackgroundImage,就像Kala的回答所假设的那样,也可能是一个不错的select。

这应该回答标题中的问题。 但是,您的第一张图片不会显示三种颜色的渐变。 它显示了四种颜色的2D渐变。 对于这样一个更昂贵的着色方法,你应该把颜色放在一个Bitmap ,并将其设置为PanelBackgroundImage

更新这是创build2D渐变的一段代码:

 Bitmap Gradient2D(Rectangle r, Color c1, Color c2, Color c3, Color c4) { Bitmap bmp = new Bitmap(r.Width, r.Height); float delta12R = 1f * (c2.R - c1.R) / r.Height; float delta12G = 1f * (c2.G - c1.G) / r.Height; float delta12B = 1f * (c2.B - c1.B) / r.Height; float delta34R = 1f * (c4.R - c3.R) / r.Height; float delta34G = 1f * (c4.G - c3.G) / r.Height; float delta34B = 1f * (c4.B - c3.B) / r.Height; using (Graphics G = Graphics.FromImage(bmp) ) for (int y = 0; y < r.Height; y++) { Color c12 = Color.FromArgb(255, c1.R + (int)(y * delta12R), c1.G + (int)(y * delta12G), c1.B + (int)(y * delta12B)); Color c34 = Color.FromArgb(255, c3.R + (int)(y * delta34R), c3.G + (int)(y * delta34G), c3.B + (int)(y * delta34B)); using ( LinearGradientBrush lgBrush = new LinearGradientBrush( new Rectangle(0,y,r.Width,1), c12, c34, 0f) ) { G.FillRectangle(lgBrush, 0, y, r.Width, 1); } } return bmp; } 

这里是你如何使用它:

  public Form1() { InitializeComponent(); panel4.BackgroundImage = Gradient2D(panel4.ClientRectangle, Color.Black, Color.FromArgb(255, 0, 255, 0), Color.Red, Color.Yellow); } 

这使用了简单的LinearGradientBrushes没有额外的颜色列表在Panel的高度上下移。

请注意, Color.Green是一个相当黑暗的色调,所以我用FromRgb为更明亮的绿色。 如果您的Panel大于256像素,则可以通过填充较大的条纹来进行优化。 如果它是垂直的,你可能想要改变循环来通过x而不是y ..

结果如下:

在这里输入图像描述

现在只需从BackgroundImage读出颜色即可:

 private void panel4_MouseClick(object sender, MouseEventArgs e) { clickedColor = ((Bitmap)panel4.BackgroundImage).GetPixel(eX, eY); } 

从鼠标点击事件参数e,你可以得到具有确切坐标点的点:

 Point clickPoint = e.GetPosition(backgroundControlWithImg); 

然后使用类似于以下的方式获取该位置的图像颜色:

 System.Drawing.Image image = backgroundControl.BackgroundImage; Bitmap _bitmap = new Bitmap(image); Color _color = bitmap.GetPixel(Point.x, Point.y); 

就是这样 你用什么颜色select器,WPF或?