Entwickler-Ecke

WinForms - Pixel in pictureBox färben


Jakob_Ullmann - So 20.09.09 13:35
Titel: Pixel in pictureBox färben
Hallo!

Ich habe jetzt mal wieder Visual C# installiert und habe versucht, ein bisschen zu malen. Versuch: Gradienz. Als Anfänger durchblicke ich noch nicht so ganz die Zusammenhänhe von pictureBox.Image, Graphics und Bitmap. Ich habe es erst einmal mit Rechtecken probiert, was natürlich langsam ist:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
        private void button1_Click(object sender, EventArgs e)
        {
            Graphics MyGraph = Graphics.FromHwnd(pictureBox1.Handle);
            
            for (int i = 1; i <= 80; i++)
            {
                for (int j = 1; j <= 80; j++)
                {
                    MyGraph.DrawRectangle(new Pen(Color.FromArgb(2552 * i + j, 0255)),
                                          new Rectangle(i, j, 11));
                    
                }
            }
        }


Scheinbar gibt es dafür nur Bitmap.SetPixel. Allerdings würde mich jetzt mal interessieren, wie ich auf einem Bitmap zeichne und wie ich es dann in eine pictureBox übertrage, bzw. wozu ich dann eigentlich Graphics brauche.

Leider weiß ich noch nicht, was so die hilfreichen Seiten für C# sind, habe die Online-Hilfe (MSDN) und das Open Book Visual C# 2008, Galileo Computing durchsucht und hab nichts brauchbares gefunden.


gfoidl - So 20.09.09 14:15

Hallo,

die Zeichenlogik in .net kehrt sich um. Windows bestimmt was wann gezeichnet werden soll.

Eine sehr gute Einführung bietet: Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox) [http://www.mycsharp.de/wbb2/thread.php?threadid=21782]

Für Gradienz gibt speziell den GradientBrush. Aber lies der erstmals den obigen Link durch.


mfG Günther


Jakob_Ullmann - So 20.09.09 14:30

Dort verstehe ich nicht sehr viel. Was ist denn bitte das _listgo, was der Autor verwendet?

EDIT: Also ich verstehe schon, was der Autor mit _listgo machen will. Aber was muss ich vorher machen, wie muss ich _listgo deklarieren?


Kha - So 20.09.09 15:07

Wenn du nicht per Graphics direkt auf die Form zeichnen, sondern ein Bitmap im Hintergrund halten willst (was du eben für pixelweisen Zugriff brauchst), kannst du dir OnPaint sparen:
herbivore hat folgendes geschrieben:
Wenn man PictureBoxen verwendet (und nur dann :-), kann man im Prinzip alles vergessen, was ich bisher gesagt habe.

Also:


Jakob_Ullmann - So 20.09.09 15:24

Hey cool, das funktioniert.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap myBmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            for (int i = 1; i <= 50; i++)
            {
                for (int j = 1; j <= 50; j++)
                {
                    myBmp.SetPixel(i, j, Color.FromArgb(2554 * i,
                                                        4 * j, 255));
                }
            }
            pictureBox1.Image = myBmp;
        }


Vielen Dank für die Hilfe!


Th69 - So 20.09.09 16:38

GetPixel und SetPixel sind relativ langsame Operationen, besonders in Schleifen.

Als Alternative gibt es andere Möglichkeiten, z.B. http://www.mycsharp.de/wbb2/thread.php?threadid=29667
oder
http://www.mycsharp.de/wbb2/thread.php?threadid=59354