OutOfMemory Exception bei Image.FromFile()

  • C#
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    OutOfMemory Exception bei Image.FromFile()

    Hey Leute,

    Kurze Erklärung, ich habe eine kleine Galerie zusammengeschustert, die soweit auch ganz gut funktioniert. An einer Stelle in meinem Projekt (die Galerie ist nur ein Teil davon) rufe ich eben die Bilder ab. Dazu benutze ich besagtes Image.FromFile() lade es in eine Bitmap-Variable und sorge noch dafür, dass der Hintergrund Transparent ist. Dann zeige ich das Bild an.

    Mein Problem:
    Wenn ich nun irgendeine Datei nehme, z.B. eine txt-Datei, und die Erweiterung von .txt in .jpg oder sonstiges Bildformat verändere, und versuche das als Bild zu laden, so springt mir eine OutOfMemoryException entgegen. Mit try-catch kann ich das natürlich umgehen, doch das kann doch nicht die beste Lösung dafür sein? Ich dachte mir ,dass ich vielleicht mit FileInfo da Etwas heraus bekomme, doch nichts dort scheint mir von großem Nutzen zu sein.

    Wisst ihr vielleicht einen guten Weg, um heraus zu finden, ob es sich wirklich um ein Bild handelt?
    @EaranMaleasi Für solch Fälle ist eine abgefangene Exception die beste Lösung.
    Wenn .NET keine Bitmap-Instanz anlegen kann, knallt es. Da gibst Du einen informativen Text in einer MessageBox aus und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Gerade folgendes gefunden : stackoverflow.com/questions/21…mage-from-file-in-c-sharp
    Dort wird auch dazu geraten Try-Catch zu verwenden.
    Ich bin erstaut, dass es hier nichts vom .Net-Framework gibt, womit man das exakt prüfen kann.

    Dennoch ist folgendes aus dem StackOverflow Thread ziemlich interessant:

    C#-Quellcode

    1. public enum ImageFormat
    2. {
    3. bmp,
    4. jpeg,
    5. gif,
    6. tiff,
    7. png,
    8. unknown
    9. }
    10. public static ImageFormat GetImageFormat(byte[] bytes)
    11. {
    12. // see http://www.mikekunz.com/image_file_header.html
    13. var bmp = Encoding.ASCII.GetBytes("BM"); // BMP
    14. var gif = Encoding.ASCII.GetBytes("GIF"); // GIF
    15. var png = new byte[] { 137, 80, 78, 71 }; // PNG
    16. var tiff = new byte[] { 73, 73, 42 }; // TIFF
    17. var tiff2 = new byte[] { 77, 77, 42 }; // TIFF
    18. var jpeg = new byte[] { 255, 216, 255, 224 }; // jpeg
    19. var jpeg2 = new byte[] { 255, 216, 255, 225 }; // jpeg canon
    20. if (bmp.SequenceEqual(bytes.Take(bmp.Length)))
    21. return ImageFormat.bmp;
    22. if (gif.SequenceEqual(bytes.Take(gif.Length)))
    23. return ImageFormat.gif;
    24. if (png.SequenceEqual(bytes.Take(png.Length)))
    25. return ImageFormat.png;
    26. if (tiff.SequenceEqual(bytes.Take(tiff.Length)))
    27. return ImageFormat.tiff;
    28. if (tiff2.SequenceEqual(bytes.Take(tiff2.Length)))
    29. return ImageFormat.tiff;
    30. if (jpeg.SequenceEqual(bytes.Take(jpeg.Length)))
    31. return ImageFormat.jpeg;
    32. if (jpeg2.SequenceEqual(bytes.Take(jpeg2.Length)))
    33. return ImageFormat.jpeg;
    34. return ImageFormat.unknown;
    35. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    EaranMaleasi schrieb:

    ziemlich interessant
    dass die vom Framework supportete Format-Liste größer ist als die hier gepostete.
    Willst Du nach jeder Format-Erweiterung des Frameworks Deinen Code anpassen?
    Willst Du nur genau die von Dir gelisteten Formate unterstützen?
    Lass es das Framework machen und gut.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!