none
Allgemeiner Fehler in GDI+ beim Versuch ein Image zu speichern RRS feed

  • 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

    Mittwoch, 4. November 2015 17:14

Alle Antworten

  • Hallo,

    wenn eine Image-Datei mit der Image.FromFile(..)- Methode geladen wird, dann bleibt die Datei gesperrt, bis die Image freigegeben wird.

    Grüße 


    • Bearbeitet Iso7 Mittwoch, 4. November 2015 21:07
    Mittwoch, 4. November 2015 20:08
  • Es funktioniert aber auch nicht, wenn ich die Datei mit RotateImg.Dispose() wieder freigebe!

    Und ich weiß keine weitere Methode...

    By The_Dani :P

    Programmiersprachen: C# (Windows Forms), Java

    Mittwoch, 4. November 2015 20:16
  • 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

    Mittwoch, 4. November 2015 21:06
  • 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

    Mittwoch, 4. November 2015 21:43
    Moderator
  • 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
    Donnerstag, 5. November 2015 08:11
  • 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

    Donnerstag, 5. November 2015 20:04
    Moderator
  • Wie kann ich einen MemoryStream initialisieren, ohne dabei Image.FromFile(...) zu verwenden?

    By The_Dani :P

    Programmiersprachen: C# (Windows Forms), Java

    Mittwoch, 11. November 2015 18:41
  • 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

    Donnerstag, 12. November 2015 12:44
  • Hallo,

    beim mir funktioniert beides nicht!

    Beim FileStream zeigt er einen Fehler an, dass die Datei zurzeit noch verwendet wird!


    By The_Dani :P

    Programmiersprachen: C# (Windows Forms), Java

    Sonntag, 22. November 2015 19:12
  • 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

    Montag, 23. November 2015 13:48