Rellene el panel con degradado en tres colores

Estoy trabajando en el proyecto y tengo que hacer una especie de selector de color con C #.

Así que decidí que sería un Panel con estos antecedentes en la aplicación Win Forms.

El fondo debe tener un degradado con tres colores en rgb: rojo (0 – 255), azul (0 – 255) y verde = 0.

gu0oJ.png

Pero no puedo encontrar ninguna información sobre lo que debería usar para esto.

Intenté escribir un código y esto es lo que hice.

{ 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); } } 

}

Y ahora tengo un panel con este gradiente

ORnzf.png

¿Qué debería usar para obtener degradado en la primera fotografía?

Y la segunda pregunta: ¿Qué debo hacer para obtener el color del píxel después de hacer clic en este fondo?

Aquí hay un ejemplo para usar un LinearGradientBrush multicolor en el evento Paint :

 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); 

enter image description here

Puede variar libremente la cantidad de colores, el ángulo o la extensión de los puntos de detención. Solo asegúrate de tener siempre el mismo número de colores y puntos de detención y déjelos comenzar en 0 y terminar en 1.

Los colores en el constructor son ignorados, por cierto …

Para obtener un color MouseClick puede codificar el 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); } } 

Si desea captar muchos clics, puede ser mejor mantener el Bitmap de Bitmap en una variable de nivel de clase en lugar de volver a crearlo todo el tiempo. Establecerlo como Imagen de fondo del panel, como asume la respuesta de Kala, también puede ser una buena opción.

Esto debería responder la pregunta en el título. Sin embargo, su primera imagen no muestra un degradado con tres colores. Muestra un gradiente 2D con cuatro colores. Para un método de coloración más costoso, debe poner los colores en un Bitmap y configurarlo como la imagen de BackgroundImage del Panel .

Actualizar Aquí hay una pieza de código que crea un gradiente 2D:

 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; } 

Aquí es cómo lo usa:

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

Esto utiliza LinearGradientBrushes simple sin una lista de colores extra bajando sobre la altura del Panel .

Tenga en cuenta que Color.Green es un tono bastante oscuro, por lo que utilicé FromRgb para un verde más shiny. Si su Panel tiene más de 256 píxeles, es posible que desee optimizar rellenando las franjas más grandes; si es vertical, puede querer cambiar el ciclo para pasar por x en lugar de y ...

Aquí está el resultado:

enter image description here

Para seleccionar con un clic, simplemente lees el color de la imagen de BackgroundImage :

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

Desde el argumento de clic del evento del mouse e, puede obtener el punto con las coordenadas exactas del clic:

 Point clickPoint = e.GetPosition(backgroundControlWithImg); 

Luego, obtenga el color de la imagen en esa posición usando algo como:

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

Algo como eso. ¿Qué estás usando para el selector de color, WPF o?