GDI+ Exception bei PicBox.Image.Save - warum?


Asterix-Ac

Erfahrenes Mitglied
#1
Hi Community,

ich habe da ein kleines Problem.
per OpenFileDialog öffne ich ein Bild und übergebe es einer PictureBox.
Nachdem ich es verändert habe, möchte ich es wieder speichern (mit einem SaveFileDialog).
Wenn ich es nun unter einem neuen Dateinamen speichere, ist alles perfekt.
Aber Wenn ich den gleichen Namen nehme, bekomme ich immer eine Exception (System.Runtime.InteropServices.ExternalException - Zusätzliche Angaben : In GDI+ ist ein allgemeiner Fehler aufgetreten).
Ich habe schon herausgefunden, dass die Datei von einem anderen Prozess verwendet wird. Aber warum? Wird nach 'pictureBox1.Image.FromFile(string FileName)' die Datei nicht mehr geschlossen?
Wie kann man das Problem lösen?
Ich hänge 2 Beispiel-Methoden an, bei denen sich der Fehler ereignet.

Danke schonmal im Vorraus.

Asterix :confused:

Code:
private void button1_Click(object sender, System.EventArgs e)
		{
			if(ofd.ShowDialog() == DialogResult.OK)
			{
				this.pictureBox1.Image = Image.FromFile(this.ofd.FileName);
			}
		}

		private void button2_Click(object sender, System.EventArgs e)
		{
			if(sfd.ShowDialog() == DialogResult.OK)
			{
				this.pictureBox1.Image.Save(this.sfd.FileName);
			}
		}
 

Asterix-Ac

Erfahrenes Mitglied
#3
Hallo Maximus,

das hat nichts mit ASP.NET zu tun. Also auch keine Zugriffsrechte. Ich arbeite mit WinForms.
Außerdem habe ich das Problem schon gelöst. GDI+hällt das zu bearbeitende Bild offen, so dass Du es nicht ein zweites Mal öffnen kannst. Du mußt es in einen Memory Stream einlesen, den dann schließen. Von dort aus kannst Du es in die PicBox saugen. Wenn Du es nach einer Veränderung Speichern willst, ist die Datei geschlossen und Du kannst es Speichern.

Asterix ;)
 
#4
Habe auch diesen GDI+ Fehler. Also auf meinem lokalen Testsytem läuft die Anzeige der Newsbilder. Nur auf dem Webserver nicht...

Code:
foreach (DataRow row in dsData.Tables[0].Rows)
        {
            string strTitel = row["NewsTitel"].ToString();
            string strInfo = "<i>" + row["NewsInfo"].ToString() + "</i>";
            DateTime dtDatum = Convert.ToDateTime(row["NewsDatum"]);
            string strNews = row["News"].ToString();
            string imgName = "newsimg/" + row["NewsID"].ToString() + ".jpg";
                       
            if (row["NewsBild"].ToString().Length > 0)
            {
                if (!File.Exists(Server.MapPath(imgName)))
                {
                    byte[] image = (byte[])row["NewsBild"];
                    MemoryStream stream = new MemoryStream();
                    stream.Write(image, 0, image.Length);
                    Bitmap bitmap = new Bitmap(stream);
                    bitmap.Save(Server.MapPath(imgName), System.Drawing.Imaging.ImageFormat.Jpeg);
                    //bitmap.Dispose();
                    //stream.Close();
                }
            }
            else
            {
                imgName = "";
            }            
            
            pnlNews2.Add(imgName, strTitel, dtDatum, strInfo, strNews);
        }

Und hier die dazugehörigen Fehlermeldung:

Code:
Serverfehler in der Anwendung /.
--------------------------------------------------------------------------------

Allgemeiner Fehler in GDI+. 
Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde. 

Ausnahmedetails: System.Runtime.InteropServices.ExternalException: Allgemeiner Fehler in GDI+.

Quellfehler: 


Zeile 98:                     stream.Write(image, 0, image.Length);
Zeile 99:                     Bitmap bitmap = new Bitmap(stream);
Zeile 100:                    bitmap.Save(Server.MapPath(imgName), System.Drawing.Imaging.ImageFormat.Jpeg);
Zeile 101:                    //bitmap.Dispose();
Zeile 102:                    //stream.Close();
 

Quelldatei: d:\inetpub\kontaktpool.de\news.aspx.cs    Zeile: 100 

Stapelüberwachung: 


[ExternalException (0x80004005): Allgemeiner Fehler in GDI+.]
   System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams) +387246
   System.Drawing.Image.Save(String filename, ImageFormat format) +69
   news.ShowNews() in d:\inetpub\kontaktpool.de\news.aspx.cs:100
   news.Page_Load(Object sender, EventArgs e) in d:\inetpub\kontaktpool.de\news.aspx.cs:22
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1061

 


--------------------------------------------------------------------------------
Versionsinformationen: Microsoft .NET Framework-Version:2.0.50727.832; ASP.NET-Version:2.0.50727.832
 

Neue Beiträge