[C#] kleines Paint Programm - Gezeichnetes Bild speichern

...komplette Frage anzeigen

1 Antwort

Hallo ichliebefragen,

ich habe mir deinen Code angeguckt und den Fehler gefunden. Hier ist ein Ausschnitt des funktionierende Code:

bool paint = false;
SolidBrush color;
//Graphics g;

public Form1()
{
    InitializeComponent();
    pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (paint)
    {
        color = new SolidBrush(Color.Black);
        //pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
        Graphics g = Graphics.FromImage(pictureBox1.Image);
        g.FillEllipse(color, e.X, e.Y, 10, 10);
        pictureBox1.Invalidate();
    }
}

Durch "pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);" wird ein "neues" Bild erstellt, wenn du das bei jedem Zeichnen aufrufst, ist es klar dass das gezeichnete nicht mehr vorhanden ist. Du musst jedoch der PictureBox ein Bild zuweisen bzw. eins erstellen, so wie ich nun im Constructor (Form1()) der Form.

Das Zeichnen ist alles richtig, du musst jedoch nach dem Zeichnen die PictureBox neu laden damit die Änderungen angezeigt werden. Hierfür verwende ich "pictureBox1.Invalidate();" (Du kannst aber auch dies hier verwenden: "pictureBox1.Image = pictureBox1.Image" Damit fügst du dem Bild das aktuelle Bild hinzu, ist ziemlich unnötig aber durch das hinzufügen eines Bildes wird dieses ebenso neu gezeichnet.

Ich habe ganz oben noch "Graphics g;" auskommentiert, da es nicht benötigt wird.


Ich hoffe ich konnte dir helfen, bei weiteren Fragen einfach meine Antwort hier kommentieren.

Mit freundlichen Grüßen KlickKlackKluck

ichliebefragen 18.10.2012, 10:23

Vielen dank für deine ausführliche Antwort!

Das zeichen funktioniert nun super und das speichern selbst gibt auch keine Exception.

Leider ist das gespeicherte Bild komplett schwarz, die Größe stimmt.

Speichern tu ich das Bild im Moment mit:

pictureBox1.Image.Save(@"C:\Users\akorb\Desktop\bild.jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);

mfg Andy

0
KlickKlackKluck 18.10.2012, 10:27

PS: Noch ein kleiner Tipp für's Zeichnen:

g.FillEllipse(color, e.X - (size / 2), e.Y - (size / 2), size, size);

(size = int)

Hierdurch entsteht das, was du zeichnest immer an der richtigen Position. Nehmen wir mal an size = 10 dann hast du (size / 2) = (10 / 2) = 5. Nun ziehst du 5 von der Position X und Y ab, wo du zeichnen möchtest. Das was du zeichnest (Rectangle, Ellipse...) behält jedoch die Breite/Höhe (Width, Height) size, also 10.

Das was du Zeichnes geht im endeffekt von dem Ausgangspunkt von dem du Zeichnes 5 nach Links und 5 nach Rechts. Somit ist das gezeichnete genau in der Mitte.

1
ichliebefragen 18.10.2012, 10:37
@KlickKlackKluck

Danke für den Tipp.

size kann ich als int deklarieren, aber da dieser kein Wert besitzt, gibt er mir natürlich eine Fehlermeldung.

Mit welchem Wert soll ich size deklarieren?

Zu meinem Speicherproblem, als png Format funktioniert alles einwandfrei. Ist dann wohl ein Problem des JPEG Formats.

0
KlickKlackKluck 18.10.2012, 10:58
@ichliebefragen

'size' ist die Breite und Höhe, die der Punkt den du zeichnen möchtest haben soll. Du hattest ja 10 gewählt, also kannst du "int size = 10;" verwenden. (Du kannst natürlich auch einstellen, das der Benutzter den Wert ändern kann, falls er größer oder kleiner zeichnen möchte.)


Zum dem Speicherproblem:

Meineswissens unterstützt Jpeg kein Transparent, daher wird das vom Bild, was keine Farbe besitzt (in diesem fall das Weiße, das bedeutet aber nicht das Weiß == Transparent ist. Wenn du Weiß auf das Bild zeichnest wird dies angezeigt.) als Transparent angezeigt; also bei Jpeg als Schwarz (da Jpeg kein Transparent anzeigen kann!!!).

Du kannst anfangs die Grundfarbe des Bildes festlegen, indem du nach dem zuweisen folgendes macht:

public Form1()
{
    InitializeComponent();

    pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    Graphics g = Graphics.FromImage(pictureBox1.Image);
    g.Clear(Color.White);
}

Damit setzt du das ganze Bild auf eine Farbe, somit kein Transparent mehr und kannst dieses dann auch als Jpeg speichern.

(Also kleinen test, kannst du bevor du die Änderung vornimmst 'color' auf Rot setzen ("color = new SolidBrush(Color.Red);"). Du wirst sehen, das der Hintergrund Schwarz angezeigt wird, jedoch die Farbe, die du gezeichnest hast in Rot. Eben weil der Hintergrund ohne "g.Clear(...)" standard Transparent ist.)

1
ichliebefragen 18.10.2012, 11:06
@KlickKlackKluck

Vielen Dank, vieles davon hatte ich bereits selbst in Erfahrung gebracht.

Dennoch bin ich nicht darauf gekommen, wo ich g.Clear hinsetzen sollte, da hast du mich jetzt aufgeklärt.

Das Speichern funktioniert jetzt super.

Also nochmal vielen vielen Dank, in 24 std kriegste hilfreichste Antwort. Zumindest dann, wenn ich sie wieder setzen kann, im Moment funktioniert das bei mir irgendwie nicht.

:)

0

Was möchtest Du wissen?