Laden...

Wie kann man ein Pixel in C# plotten?

Erstellt von Micha369 vor 7 Jahren Letzter Beitrag vor 7 Jahren 5.795 Views
M
Micha369 Themenstarter:in
16 Beiträge seit 2006
vor 7 Jahren
Wie kann man ein Pixel in C# plotten?

Hallo Gemeinde,

bin ein blutige C#-Neuling und deshalb werden viele evtl. meine komischen Fragen nicht verstehen.

Ich möchte ein Pixel an der Stelle x1 und y1 in einem Grafikfenster ausgeben.

Wie macht man das?

Ich möchte meine ersten C# Spielereien mit SharpDevelop machen.
Geht das damit denn überhaupt? Denn ich denke mal, mal muss eine Grafik-Bibliothek einbinden. Ich stelle mir das so vor, dass ich im Code zusätzlich zu

using System;

noch

using Graphics; 

(oder wie die auch immer heißen mag)

verwenden muss.

Gibt es irgendwo eine kleine Bibliothek zur freien Nutzung?

Wie gesagt, es sollen nur Pixel geplottet werden können.

Und wie bindet man diese Bibliothek dann ein?

Und wo muss die Datei dieser Bibliothek dann abgelegt werden?

Vielen Dank für Eure Hilfe.

MfG

Micha

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo Micha369,

eigentlich bringt das das Framework schon mit.

(wegen deiner anderen Fragen informier dich bitte erstmal über die C#-Grundlagen [FAQ] Wie finde ich den Einstieg in C#? )

Du kannst einen einzelnen Pixel in einer WinForms-Applikation beispielsweise mit

private void Form1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.FillRectangle (Brushes.Black , new Rectangle(50, 50, 1, 1));
    }

zeichnen. Vielleicht kannst du sagen, was du vorhast? 😉

Gruss

Coffeebean

709 Beiträge seit 2008
vor 7 Jahren

Hallo Micha,
wenn du Windows Forms nutzt, dann schau dir mal [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox) an.

Gruß
Micha =)

M
Micha369 Themenstarter:in
16 Beiträge seit 2006
vor 7 Jahren

Vielen Dank für Eure Tipps. Ich werde mir das alles genau ansehen.

Gruß

M
Micha369 Themenstarter:in
16 Beiträge seit 2006
vor 7 Jahren

Vielleicht kannst du sagen, was du vorhast? 😉

Vor vielen Jahre habe ich schon einiges programmiert, aber noch nicht unter Windows. Das ganze war noch auf MS-DOS.
Turbo Pascal, Basic

Habe auch schon mit Assembler etwas gemacht. Aber das ist viele Jahre her.
Habe dann später in meiner Freizeit hobbymäßig mal in OOP hineingeschnuppert. Visual Basic.
Ich fand das aber alles viel zu kompliziert und aufwändig und hatte die Lust verloren. Ich habe keine Ahnung wozu ich das machen sollte.

Was ich eigentlich möchte ist einfach nur ein paar Pixel mit bestimmten Farben berechnen und auf dem Bildschirm darstellen. Oder mal eine kleine mathematische Spielerei programmieren.
Dazu möchte ich auch nur eine ganz kleine Entwicklungsumgebung verwenden.
Also um Himmels willen nicht Visual C oder so etwas, was man dann vom PC nie wieder herunterbekommt.

Früher gab es kleine Programmiersprachen, mit denen man mal etwas machen konnte und nicht gleich vorher 2 Jahre intensiv die Windows-Welt studieren musste.
Wenn ich nur irgendein kleines Programmiertool fände womit ich mal ein paar Pixel oder Linien berechnen und zeichnen könnte!

Ich brauche eigentlich kein OOP und keine .NET oder Frame oder was es da sonst noch alles gibt.

EDIT:
/*
diese Aussage war wohl etwas verfrüht. Sorry!
Es hat mich extrem abgeschreckt, als ich neulich versuchsweise Visual C# installiert hatte. Es war so dermaßen viel dass ich mir wirklich die Frage stelle, ob das das richtige Tool ist für meine kleinen mathematischen Spielereien.
*/

Es reicht mir völlig aus, wenn ich eine Möglichkeit hätte den Bildschirm zu leeren und dann dort Pixel oder Linien zu plotten.

Vielleicht kennt ja jemand das passende Tool für mich.

Vielen Dank

Gruß

Micha

Z
403 Beiträge seit 2007
vor 7 Jahren

Wie wäre es mit JavaScript und Canvas?

http://www.w3schools.com/html/html5_canvas.asp

M
Micha369 Themenstarter:in
16 Beiträge seit 2006
vor 7 Jahren

Hallo Zicore,

danke für diesen Tipp. Aber könnte ich nicht bei C# bleiben, zum Beispiel bei SharpDevelop?

Ich müsste lediglich herausfinden, wie man hier ein Grafikfenster erstellt und dort etwas zeichnen kann.
Es wird doch evtl. eine Bibliothek geben, die man dort einbinden kann, oder?

Oder warte, kann ich in der SharpDevelop IDE auch .Net-Framework Klassen und Objekte ansprechen? Denn Coffeebean erwähnte ja, dass die Routinen zum Zeichnen bereits dort enthalten sind.

Ich wollte jetzt nicht schon wieder mit etwas ganz neuem anfangen. 😃

Außerdem bilde ich mir ein, dass ein C#-Programm schneller läuft als ein JavaScript Programm.

Gruß,

Micha

M
Micha369 Themenstarter:in
16 Beiträge seit 2006
vor 7 Jahren

Du kannst einen einzelnen Pixel in einer WinForms-Applikation beispielsweise mit

private void Form1_Paint(object sender, PaintEventArgs e)  
    {  
        e.Graphics.FillRectangle (Brushes.Black , new Rectangle(50, 50, 1, 1));  
    }  

zeichnen.

Coffeebean

Ich bekomme den Fehler:

Fehlermeldung:
Der Typ- oder Namespacename "PaintEventArgs" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) (CS0246)

Was für eine using-Direktive muss ich denn oben notieren um die Klassen und Objekte von WinForms nutzen zu können?

Danke,

Gruß

771 Beiträge seit 2009
vor 7 Jahren

Hast du überhaupt ein WindowsForms-Projekt erstellt? Dann hast du schon automatisch den Vorgabe-Code für ein Fenster (Form).

M
Micha369 Themenstarter:in
16 Beiträge seit 2006
vor 7 Jahren

nein, hatte ich nicht gemacht.

War mir jetzt nicht klar, dass man aus diversen Projekten etwas wählen muss.

Dachte, es genügen entsprechende using Anweisungen.

Gruß,

Michael

1.040 Beiträge seit 2007
vor 7 Jahren

Dachte, es genügen entsprechende using Anweisungen.

Reichen prinzipiell auch. Allerdings müssen dann auch entsprechende Referenzen vorhanden sein. Je nach ausgewähltem Projekttyp, werden andere Referenzen vorausgewählt. =)

Z
403 Beiträge seit 2007
vor 7 Jahren

So oder so wirst du dich mit den Grundlagen der jeweiligen Plattform vertraut machen müssen ob HTML und JavaScript oder .Net Framework und C#.

Im Prinzip wurden dir die nötigen Tipps genannt um durchzustarten.

Hier nochmal kurz:

  • Starte ein WinForms Projekt.
  • Erzeuge dir ein Panel.
  • DoubleBuffered im Panel einschalten.
  • OnPaint überschreiben oder Paint Event abonnieren und los Zeichnen.

Edit: Zum Thema Performance. C# setzt zumindest bei WinForms auf die GDI+ API von Windows. Die ist mittlerweile in die Jahre gekommen und nicht das schnellste. Für die meisten Dinge reicht es allerdings noch.

Bei JavaScript hängt es stark vom Browser bzw. dessen JavaScript Engine ab. Chrome ist beispielsweise deutlich schneller als Firefox.

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo Micha369,

Was für eine using-Direktive muss ich denn oben notieren um die Klassen und Objekte von WinForms nutzen zu können?

[FAQ] CS0234 / CS0246 - Der Typ- oder Namespacename "Foo" konnte nicht gefunden werden

Gruss

Coffeebean

M
Micha369 Themenstarter:in
16 Beiträge seit 2006
vor 7 Jahren

Es tut mir leid, aber ich verrenne mich hier jedes Mal, wenn ich versuche, irgendeinen Link von Euch durchzuarbeiten bzw. zu verstehen.

Ich komme einfach nicht zum Ziel ein paar Pixel auf den Bildschirm zu bekommen.
Was ist denn das OnPaint?

Ich brauche einen Kasten, also meinetwegen eine PictureBox oder ein Panel in einem Windows Form.
Dann möchte ich dort Punkte, einzelne Pixel plotten. Z.B. mit einem Befehl wie:

PlotPoint(x,y,farbe);
Pixel(x,y,farbe);

oder wie auch immer.

Wenn meine Grafik fertig ist dann soll sie so lange angezeigt bleiben bis ich das Fenster wieder schließe.

Früher war so etwas super easy, ganz ohne OnPaint und PainEvents oder solche Dinge.

Evtl. ist ja dieses WinForms viel zu kompliziert für das, was ich will.

Übrigens:

Mittlerweile habe ich herausbekommen, wie man Linien darstellt oder andere Geometrien wie Rechtecke oder Ellipsen in einem Windows Form. Aber was einfach nicht geht ist einen einfachen Punkt zu zeichnen.

Ich möchte auch keine work arounds, wie Rechteck der Größe 1 oder so etwas.

Vielen Dank für Eure Hilfe.

Gruß

771 Beiträge seit 2009
vor 7 Jahren

GDI kennt aber keine einzelnen Punkte, also wirst du dann eben mittels Rectangle einen zeichnen müssen (erstelle dir einfach eine eigene Methode dafür - wie du es ja schon gepostet hast).
Und der Begriff "Plotten" ist auch hierfür nicht wirklich angebracht, denn ein Bildschirm ist ja kein Drucker o.ä.

P
1.090 Beiträge seit 2011
vor 7 Jahren

Grundlegend kannst du dir ein Bitmap erzeugen und es in einer Picturbox Anzeigen.
Und mit der Bitmap.SetPixel Pixel auf das Bild Zeichnen.

OnPaint ist eine eine Methode des Windows Forms, die du überschreiben kannst (wenn deine Klasse von Forms Geerbt hat) und in der du selber dann auch was auf die Form Zeichnen kannst.

Wenn du Probleme hast die Sachen in den Links zu verstehen. Liegt es daran, das dir Grundlagen Fehlen. (Wurde ja schon angesprochen) Und dich darum dich dar grob einzuarbeiten und die Sachen zu verstehen wirst du nicht herum kommen.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

O
79 Beiträge seit 2011
vor 7 Jahren

Anders formuliert: Dre TE stammt aus einer Zeit, wo man 5 Zeilen aus einem Buch abtippte und das Ergebnis war auf dem Bildschirm. Kenn ich auch noch, sowas.

Diese Zeiten sind schon lange vorbei.

Es braucht nun ein wenig Einarbeitung, bis man begriffen hat, das es keinen Grafikmodus mehr gibt (weil man durch das Betriebssystem schon längst im Grafikmodus ist) und bis man verstanden hat, wie man nun einen Pixel irgendwo hin setzt.

M
Micha369 Themenstarter:in
16 Beiträge seit 2006
vor 7 Jahren

Anders formuliert: Dre TE stammt aus einer Zeit, wo man 5 Zeilen aus einem Buch abtippte und das Ergebnis war auf dem Bildschirm. Kenn ich auch noch, sowas.

Diese Zeiten sind schon lange vorbei.

LOL, genau das ist mein Problem, 😁
Das Programmieren war ja meistens nur Hobby für mich. Und irgendwie hatte ich dann die Lust verloren bzw. bin andere Freizeitbeschäftigungen nachgegangen.
Aber nun überkam es mich mal wieder.

Zurück zum Programmieren...

ich bin auch schon auf den Trichter gekommen mit Bitmaps zu arbeiten.
Dort kann ich einzelne Pixel setzen, was mir eigentlich schon reichen würde.

Jedoch möchte ich verstehen, warum ich dort jetzt keine Linie mehr zeichnen kann.
Könnte sich jemand bitte mal mein Stückchen Code ansehen und evtl. mir helfen?
Das Programm läuft ohne Fehlermeldung aber die Linie ist nicht zu sehen.

Ich habe also eine PictureBox namens drawingArea in einem Windows Form erzeugt.
Dann habe ich ein Objekt drawArea dem die Picturebox zugeordnet wird (was hier genau abläuft vestehe ich noch nicht).

Dann lese ich ein Bild in die Bitmap ein und manipuliere die Farben etwas (nur zu Test- und Lernzwecken).
Dann setze ich noch einen weißen Einzelpunkt mitten ins Bild.
dann wollte ich noch eine Linie zeichnen. Diese wird jedoch nicht dargestellt.
Warum nur nicht?


using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace test_Bitmap
{
	public partial class MainForm : Form
	{
		Graphics drawArea;
		public MainForm()
		{
			InitializeComponent();
			drawArea = drawingArea.CreateGraphics();
		}
		void Button1Click(object sender, EventArgs e)
		{
			    try
    {
        // Retrieve the image.
        Bitmap image1 = new Bitmap(@"C:\temp\schnecke_klein.bmp", true);
        int x, y;
		Color oneColor = Color.White;
		Pen whitePen = new Pen(Color.White);
		// Loop through the images pixels to reset color.
        for(x=0; x<image1.Width; x++)
        {
            for(y=0; y<image1.Height; y++)
            {
            	// int t = 15;
                Color pixelColor = image1.GetPixel(x, y);
                Color newColor = Color.FromArgb(pixelColor.R, 0, 0);
               // Color newColor = Color.FromArgb(pixelColor.R, pixelColor.G, pixelColor.B); 
                image1.SetPixel(x, y, newColor);
            }
        }
		oneColor=Color.White;
        image1.SetPixel(100, 100, oneColor);
        // Set the PictureBox to display the image.
        drawingArea.Image = image1;
        // PictureBox1.Image = image1;
        drawArea.DrawLine(whitePen, 20, 150, 400, 180);
        // Display the pixel format in Label1.
        string pf = image1.PixelFormat.ToString();
        Label1.Text = "Pixel format: "+pf;
    }
    catch(ArgumentException)
    {
        MessageBox.Show("There was an error." +
            "Check the path to the image file.");
    	
    }
		}
	}
}

Danke für Eure Hilfe!!!

5.658 Beiträge seit 2006
vor 7 Jahren

Hi Micha369,

drawArea ist vom Typ Graphics. Dort befinden sich die ganzen Zeichenfunktionen, die du benötigst, um Linien usw. zu Zeichnen. Das Objekt legst du aber nicht selbst an, sondern bekommst es von dem jeweiligen Steuerelement übergeben, wenn es gezeichnet wird. Das passiert z.B. wenn das Fenster vergrößert/verkleinert wird, oder in den Vordergrund geholt wird. Und dazu wird die OnPaint-Methode oder das Paint-Event aufgerufen, so daß du deinen Code dort rein schreiben müßtest. Die Vorgehensweise ist aber bereits detailliert in [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox) beschrieben.

//Edit:

Ist auch gar nicht soo schwierig: Erstelle dir eine leere Form, und erstelle im Code eine Methode: protected override void OnPaint (PaintEventArgs e). Dort bekommst du das Graphics-Objekt als Eigenschaft des Parameters e. Damit kannst du dann zeichnen, was du möchtest.

Weeks of programming can save you hours of planning

Z
403 Beiträge seit 2007
vor 7 Jahren

Das Manipulieren einzelner Pixel macht man tatsächlich besser mit Get- und Setpixel, allerdings sind die Standard Methoden viel zu langsam.

Siehe auch: GetPixel und SetPixel um Längen geschlagen. 800 mal schneller

Hier ein Projekt von mir welches dir vielleicht als Beispiel dienen kann: Perlin Noise Textur Generierung