You are not logged in.

  • Login

1

Thursday, June 9th 2011, 2:55am

[C#] Bild von PictureBox speichern

Hallo an alle,

da Thema gibt es schon zig mal im Internet. Entweder habe ich einen Knoten im Hirn oder irgendwas geht schief...

Ich habe eine Picturebox. Da zeichne ich mit Graphics. Das Zeichnen selbst wird in dem Paint Event ausgeführt, sodass e.Graphics als Graphic-Element dient.

Das Zeichnen funktioniert tadellos. Wenn ich es jedoch ein Bild speichern will....

egal wo ich versuche ein Bitmap anzulegen - in dem event selbst, in der Methode, die vom Event aufgerufen wird, nachträgtlich mit variablenzwischenspeicherung - ich kriege immer schwarzes Bild.
Habe schon versucht e.Graphics.Save zu machen - nutzlos. Überlegt ob ich eventuell den Graphics erstmal freigeben muss - fehlanzeige

meine Struktur bis jetzt:

C# Quellcode

1
2
3
4
5
6
7
private void pcb_paint_Paint(object sender, PaintEventArgs e) {
    if (Globals.isParsed) {
        visualizeGraph(e.Graphics);
        Bitmap bild = new Bitmap(this.Width, this.Height, e.Graphics);
        bild.Save("C:/test.jpeg", ImageFormat.Jpeg);
    }
}


Ich habe gelesen dass man das Bild als Image-Attribut bei PictureBox ablegen muss - einmalig wäre es ok, aber wenn ich das fest einprogrammiere, dass es bei jedem Paint-Event mir das hin und her in Image konvertiert - dauert es einfach zu lange...

Ab und zu fliegt "allgemeiner Fehler in der GDI+" raus...

Vielleicht ist die Lösung einfacher als ich es mir vorstelle...

ich danke für jeden Lösungsansatz.

mfG, Nikolai

2

Wednesday, June 15th 2011, 12:17am

Das Thema hat sich erledigt.

C# Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
private void pcb_paint_Paint(object sender, PaintEventArgs e) {
    if (Globals.isParsed) {
        // leeres Bild erzeugen
        Image emptyImage = new Bitmap(Globals.blattSize[0], Globals.blattSize[1]);
        // als Hintergrundbild der PictureBox setzen
        pcb_paint.BackgroundImage = emptyImage;
        // leeren Graphics nehmen von dem leeren Bild
        Graphics g = Graphics.FromImage(emptyImage);
        // nach Lust und Laune rummalen (g.Save() nach dem malen nicht vergessen; könnte bös enden, muss es aber nicht...)
        visualizeGraph(g);
    }
}


C# Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void cmd_pic_Click(object sender, EventArgs e) {
    SaveFileDialog dia = new SaveFileDialog();
    dia.Filter = "BMP|*.bmp|PNG|*.png|JPEG|*.jpeg|GIF|*.gif|ICON|*.ico|TIFF|*.tiff";
    dia.FilterIndex = 1;
    if(dia.ShowDialog() == System.Windows.Forms.DialogResult.OK){
        Bitmap bild = new Bitmap(pcb_paint.BackgroundImage);
        ImageFormat format;
        switch (dia.FilterIndex) {
            case 1:
            default:
                format = ImageFormat.Bmp;
                break;
            case 2:
                format = ImageFormat.Png;
                break;
            case 3:
                format = ImageFormat.Jpeg;
                break;
            case 4:
                format = ImageFormat.Gif;
                break;
            case 5:
                format = ImageFormat.Icon;
                break;
            case 6:
                format = ImageFormat.Tiff;
                break;
            }
            bild.Save(dia.FileName, format);
        }
    }
}


Grüße,
Nikolai

Similar threads

Social bookmarks