Zum Inhalt springen

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


Gateway_man

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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...