Gateway_man Geschrieben 3. März 2012 Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 3. März 2012 Autor Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 3. März 2012 Teilen 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 ;-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 3. März 2012 Autor Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 4. März 2012 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 4. März 2012 Autor Teilen Geschrieben 4. März 2012 Vielen Dank, aber ich werd mir was saueres Überlegen . Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.