Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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

  • Autor

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.

  • Autor

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 Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.