Gateway_man Geschrieben 3. März 2012 Geschrieben 3. März 2012 Guten Morgen, ich konvertiere momentan Bilder und will mir letztendlich das byte[] Array der konvertierten Bilder krallen um diese zu verarbeiten. Allerdings bekomme ich bei der Save Methode immer eine System.Runtime.InteropServices.ExternalException. Unglücklicherweise wird die Exception in der Image Klasse abgefangen und somit bekomme ich keine richtigen Informationen darüber was falsch lief. Es steht lediglich im Output: Eine Ausnahme (erste Chance) des Typs "System.Runtime.InteropServices.ExternalException" ist in System.Drawing.dll aufgetreten. Ich finde das sehr seltsam. Die Formatänderungen an den Bildern funktionieren aber. Das habe ich bereits überprüft. Hier sind die Funktionen die ich für die Konvertierung nutze: public static Image ConvertTo(ImageFormat format, Bitmap bmp) { Image result = null; try { if (bmp != null) { MemoryStream mem = new MemoryStream(); bmp.Save(mem, format); result = Image.FromStream(mem); mem.Flush(); mem.Close(); mem.Dispose(); } } catch { } return result; } Für die gleichzeitige Änderung der Bildquallität nutze ich folgende Funktion: public static Image ConvertTo(ImageFormat format, long quallity, Bitmap bmp) { Image result = null; MemoryStream mem = new MemoryStream(); EncoderParameters para = new EncoderParameters(1); EncoderParameter spara = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quallity); ImageCodecInfo info = GetEncoder(format); if (info != null) { try { para.Param[0] = spara; bmp.Save(mem, info, para); result = Image.FromStream(mem); mem.Flush(); mem.Close(); mem.Dispose(); } catch { } } return result; } Um das ByteArray zu erhalten nutze ich folgende Funktion: public static byte[] Image2Byte(Image img) { byte[] result = null; if (img != null) { try { MemoryStream mem = new MemoryStream(); img.Save(mem,img.RawFormat); //Nach img.Save steigt er aus und //im Output Fenster wird die Exception protokolliert. result = mem.GetBuffer(); mem.Flush(); mem.Close(); mem.Dispose(); } catch { } } return result; } Ich habe auch bereits andere Überladungen von Save() ausprobiert. Das Ergebnis ist das selbe . Ebenfalls hab ich es mit unterschiedlichen Format auspropiert. Alles ohne Erfolg. Kennt jemand das Verhalten? lg Gateway
Gateway_man Geschrieben 3. März 2012 Autor Geschrieben 3. März 2012 Okay das ist kurios. Ich hab den Memory Stream mal nicht geschlossen und siehe da es funktioniert?!? Warum diese Abhängigkeiten existieren weiß ich nicht aber naja gut es funktioniert, auch wenn ich nicht glücklich darüber bin den MemoryStream offen lassen zu müssen.
SilentDemise Geschrieben 3. März 2012 Geschrieben 3. März 2012 Und wenn du um den MemoryStream einfach ein using setzt? Dann wird er automatisch für dich entsorgt wenn er nicht mehr gebraucht wird. Ist eigentlich die Standard Vorgehensweise bei solchen Ressourcen ;-)
Gateway_man Geschrieben 3. März 2012 Autor Geschrieben 3. März 2012 Ich dachte eigentlich das es beim Using so geregelt ist, das nach dem Codeblock-Ende des Usings der Stream automatisch freigegeben wird. Daher hab ich das ja auch nicht gemacht, da die Konvertierungsfunktion als Result das Image Objekt liefert. Verstehst du was ich meine? public static Image ConvertTo(ImageFormat format, Bitmap bmp) { Image result = null; try { if (bmp != null) { using (MemoryStream mem = new MemoryStream()){ bmp.Save(mem, format); result = Image.FromStream(mem); mem.Flush(); //Innerhalb ist der MemoryStream gültig } //Außerhalb ist er nichtmehr gültig und wird freigegeben //Da ich aber mit dem ResultImage arbeiten möchte ist das ungünstig. } } catch { } return result; } So jetz habe ich Gewissheit. http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx" data-cite="\"http://msdn.microsoft.com/en-us/library/93z9ee4x.aspx"> You must keep the stream open for the lifetime of the Image. lg Gateway
SilentDemise Geschrieben 4. März 2012 Geschrieben 4. März 2012 Dann setz das return doch in das using statement mit rein, oder seit ein Property in der Klasse. Einfach offen lassen ist aber unsauber.
Gateway_man Geschrieben 4. März 2012 Autor Geschrieben 4. März 2012 Vielen Dank, aber ich werd mir was saueres Überlegen .
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden