2015-05-20 10 views
5

Ich arbeite am Projekt und ich muss eine Art Farbauswahl mit C# machen.Fill Panel mit Farbverlauf in drei Farben

Also habe ich beschlossen, dass es ein Panel mit diesem Hintergrund in Win Forms App sein wird.

Hintergrund soll Steigung mit drei Farben in rgb hat: rot (0 - 255), Blau (0 - 255) und grün = 0.

gu0oJ.png

Aber ich kann keine Informationen finden über was soll ich dafür verwenden?

Ich habe versucht, etwas Code zu schreiben und hier ist was ich getan habe.

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

}

Und jetzt habe ich Panel mit diesem Farbverlauf

ORnzf.png

Was soll ich Steigung auf dem ersten Bild zu bekommen verwenden?

Und zweite Frage: Was soll ich tun, um die Pixelfarbe nach dem Klicken auf diesen Hintergrund zu bekommen?

+0

auch könnte diese Verbindung einige Ihrer Fragen helfen beantworten: https://msdn.microsoft.com/en-us/magazine/cc164113.aspx –

+0

meine Antwort aktualisiert Siehe ..! – TaW

Antwort

10

ist ein Beispiel für die Verwendung einer Mehrfarbe LinearGradientBrush im Paint Ereignisse:

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

Sie frei, die Anzahl der Farben variieren können, um den Winkel oder die Ausbreitung der Anschlagpunkte. So stellen Sie sicher, dass Sie immer die gleiche Anzahl von Farben haben und Haltepunkte und lassen Sie sie bei 0 und endet am 1.

Die Farben im Konstruktor beginnen ignoriert werden, btw ..

Um eine klickten Farbe erhalten Sie kann Code die 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(e.X, e.Y); 
    } 
} 

Wenn Sie viele Klicks fangen wollen kann es besser sein, die Bitmap in einer Klassenstufe variabel zu halten, anstatt es die ganze Zeit neu zu erstellen .. sie als Background Panel einstellen, wie Kala Antwort geht davon aus, dass auch eine gute Option sein könnte.

Dies sollte die Frage im Titel beantworten. Ihr erstes Bild zeigt jedoch keinen Farbverlauf mit drei Farben. Es zeigt einen 2D-Verlauf mit vier Farben. Für solch eine teurere Färbemethode sollten Sie die Farben in eine Bitmap setzen und sie als Panel 's BackgroundImage setzen.

aktualisieren hier ein Stück Code, das eine 2D-Gradient erzeugt:

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

Hier ist, wie Sie es verwenden:

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

Diese einfache verwendet LinearGradientBrushes ohne eine zusätzliche Liste Farben gehen hinunter über die Höhe des Panel.

Beachten Sie, dass Color.Green ein eher dunkler Farbton ist, also habe ich FromRgb für ein helleres Grün verwendet. Wenn Ihr Panel größer als 256 Pixel ist, möchten Sie möglicherweise durch Füllen größerer Streifen optimieren. Ifs ist vertikal Sie die Schleife ändern zu gehen über x statt y ..

Hier ist das Ergebnis möchten:

enter image description here

Um wählen Sie mit einem Klick Sie jetzt einfach ausgelesen, um die Farbe die von BackgroundImage:

private void panel4_MouseClick(object sender, MouseEventArgs e) 
{ 
    clickedColor = ((Bitmap)panel4.BackgroundImage).GetPixel(e.X, e.Y); 
} 
+0

vielen Dank, Mann! – Buga1234

2

Von der Veranstaltung Argument e Mausklick können Sie den Punkt mit den genauen Koordinaten des Klicks erhalten:

Point clickPoint = e.GetPosition(backgroundControlWithImg); 

erhalten Sie dann die Farbe des Bildes an dieser Position wie etwas mit:

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

So ähnlich. Was verwendest du für den Color Picker, WPF oder? Hier

+0

danke fot antworten, Ok mit dem Klick habe ich verstanden, wie es funktioniert. Das Hauptproblem ist, dieses Panel mit Farbverlauf zu machen. Hast du irgendwelche Lösungen dafür? Ich benutze Windows Forms nicht WPF, aber ich kann versuchen, es in WPF zu tun, wenn es eine Lösung gibt – Buga1234