Fragensteller
Allgemeiner Fehler in GDI+ beim Versuch ein Image zu speichern

Allgemeine Diskussion
-
Hallo,
ich versuche ein Bild, das ich gedreht habe, wieder zu speichern!
string sFile = lsvBilder.FocusedItem.SubItems[1].Text; picBild.Image.Dispose(); using (Image RotateImg = Image.FromFile(sFile)) { System.Drawing.Imaging.ImageFormat format = RotateImg.RawFormat; RotateImg.RotateFlip(RotateFlipType.Rotate270FlipNone); try { RotateImg.Save(sFile, format); } catch { } //hier hatte ich schon mal: RotateImg.Dispose(); stehen, hat aber nichts geändert... } picBild.Image = Image.FromFile(sFile);
Der Fehler tritt nur auf, wenn ich das selbe Bild aus dem Fokus nehme, und dann wieder versuche!
Wenn ich das Programm neu starte, funktioniert alles wieder, bis ich das Bild erneut drehen will!Danke :)
By The_Dani :P
Programmiersprachen: C# (Windows Forms), Java
- Typ geändert Aleksander Chalabashiev Montag, 30. November 2015 10:27 keine bestätigte Lösung
Alle Antworten
-
In deinem Beispiel wird Dispose() automatisch nach dem Verlassen des using-Blocks aufgerufen.
Tritt der Fehler in RotateImg.Save(sFile, format) auf?
Wenn ja, dann kannst Du versuchen die Image unter anderen Name zu speichern und dann die Datei umbennen.
Grüße
-
Hallo zusammen,
ich habe jetzt etliches versucht den Fehler zu reproduzieren - ohne Erfolg. Die FromFile-Methode gab bei mir stets ein Bitmap-Objekt zurück. Dieses hält die Bilddaten soweit ich weiß im Speicher und lädt sie nicht dynamisch von der Festplatte (im Gegensatz zu einigen WPF-Klassen).
Wird die Datei noch irgendwo anders verwendet?
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Ja zuvor und danach greift eine PictureBox auf das Image zu!
"picBild" gibt das Image aber wieder frei!
->picBild.Image.Dispose();
By The_Dani :P
Programmiersprachen: C# (Windows Forms), Java
- Bearbeitet The_Dani Donnerstag, 5. November 2015 08:12
-
Hallo,
ich habe nochmal recherchiert. Die Bitmap-Klasse scheint durchaus Lazyloading zu unterstützen. In dem Fall empfehle ich dir mal den Trick mit dem Speichern einer 2. Datei und der anschließenden Umbenennung auszuprobieren.
Meiner Meinung nach wäre es schon das ganze über einen MemoryStream dazwischen zu lösen. Das heißt du speicherst die bitmap in den Stream, gibst die Bitmap frei, erzeugst ein Bitmap vom Stream und speicherst diese.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo,
Du kannst auch FileStream verwenden:
try { string sFile = @"C:\Mypicture.png"; FileStream fs = new FileStream(sFile, FileMode.Open); try { using (Image image = Image.FromStream(fs)) { image.RotateFlip(RotateFlipType.Rotate270FlipNone); fs.Close(); fs = null; image.Save(sFile); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { if (fs != null) { fs.Close(); fs = null; } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); }
Grüße -
Hallo,
wie Du geschrieben hast, wird die Datei in deinem Code, wo Du den PictureBox initialisierst, auch verwendet. Auf diese Stelle wird die Datei nicht freigegeben. Die Datei muss zuerst geschlossen werden und dann kannst Du die Datei überschreiben.
Grüße