Zum Inhalt springen

[C#] Image.Save u. Bitmap.Save werfen jedes mal ExternalExceptions


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben

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 ;-)

Geschrieben

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

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...