OutOfMemoryException Lädt mit dem Compact Framework ein großes Bild in ein Bitmap-Objekt

Ich habe ein Problem mit einem Speicherverlust.

Ich habe diesen Code in einembutton_click :

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

    Dim ms As New IO.MemoryStream
    Dim bm As New Bitmap("\Application Data\imgs\IMG22.jpg")
    bm.Save(ms, Drawing.Imaging.ImageFormat.Jpeg)
End Sub

Dieser Code funktioniert einwandfrei, wenn ich die EXE-Datei auf meinem Laptop ausführe (ich meine unter Windows 7/32 Bit mit dem vollständigen .NET-Framework), aber wenn ich die App auf einem Gerät mit Windows Mobile 6.1 ausführe, löst die App diese Ausnahme aus:

SmartDeviceProject22.exe
OutOfMemoryException

beim

Microsoft.AGL.Common.MISC.HandleAr(PAL_ERROR ar)
at
System.Drawing.Image.Save(Stream stream, ImageFormat format)
at
SmartDeviceProject22.Form1.Button3_Click(Object sender, EventArgs e)
at
....

Die Bildgröße beträgt ca. 200kb und die Breite und Höhe ca. 1500px. Details des Bildes:

Dimension: 1536 x 2048Horizontale Auflösung: 72 dpiHorizontale Auflösung: 72 dpiBittiefe: 24Auflösungseinheit: 2Farbdarstellung: sRGB -

Jede Hilfe wird sehr geschätzt.

Ich versuche den Code von @asawyer zu entfernen, entferne sogar ALLE Codes, Verweise usw. und das Problem bleibt bestehen, ich denke, es liegt etwas an der Breite / Höhe des Bildes oder am kompakten Framework.

Irgendwelche anderen Ratschläge?

Lösung und Erklärung des Problems Nun, nach einigen Tests war das eigentliche Problem, dass es sich nicht um ein Speicherverlust handelte, genauso wie @pdriegen sagte, dass es sich um ein Speicherproblem handelt.

Ich ändere meinen Code in diesen (und teste ihn auf dem Mobilgerät):

 Dim fs As IO.FileStream = IO.File.OpenRead("\Application Data\ryder\IMG23.jpg")
 Dim arrb(fs.Length) As Byte     
 fs.Read(arrb, 0, arrb.Length)
 fs.Close()
 fs.Dispose()

Und mit dem obigen Code erhalte ich (anscheinend) ein Byte () (Array) des Bildes, das mit dataSet in der Datenbank gespeichert werden soll.

Fazit: Laden Sie ein Bitmap-Objekt in memoryStream, schlechte Idee. Vielen Dank an alle, die sich die Zeit nehmen, mein Problem zu lesen, und besonders an diejenigen, die ihre Antwort posten.

Lösung (wenn Sie das Bild in einer Bildbox anzeigen müssen):

Nach ein paar Wochen ist dies wahrscheinlich die beste (kostenlose) Lösung: Implementieren Sie einen ImageHelper wie hier erklärt:ImageHelper

Diese Klasse / Beispiel verwendet den Drawing NameSpace von OpenNetCF (http://www.opennetcf.com/)

Es funktioniert großartig und löst meine Probleme mit dem Speicher, wenn ich große Bitmaps in den Speicher lade. Tatsächlich laden wir eine Miniaturansicht, so dass sich die Größe des Speichers erheblich verringert und das OutOfMemory-Ausnahmebedingungsproblem vermieden wird.

Über Chris Tacke Mir ist gerade klar, dass der Autor des Posts über ImageHelper und Mitbegründer von OpenNetCF hier bei stackoverflow ist. Hier ist sein Profil:https://stackoverflow.com/users/13154/ctacke

Antworten auf die Frage(2)

Ihre Antwort auf die Frage