OutOfMemoryException загрузка большого изображения в объект Bitmap с помощью Compact Framework
У меня проблема с утечкой памяти.
У меня есть этот код вbutton_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
Этот код прекрасно работает, когда я запускаю .exe на своем ноутбуке (я имею в виду под windows7 / 32bits с полной .net framework), но когда я запускаю приложение на устройстве с WindowsMobile 6.1, приложение выдает это исключение:
SmartDeviceProject22.exe
OutOfMemoryException
в
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
....
Размер изображения составляет около 200 КБ, а ширина и высота около 1500 пикселей. Детали изображения:
Dimension: 1536x2048 Horizontal Resolution: 72dpi Horizontal Resolution: 72dpi Bit depth: 24 Resolution unit: 2 Color representation: sRGB -Любая помощь будет по достоинству оценена.
Я пробую код @asawyer, даже удаляю ВСЕ код, ссылки и т. Д., И проблема сохраняется, я думаю, это что-то о ширине / высоте изображения или с компактной структурой.
Любой другой совет?
Solution and explanation of the problem Ну а после тестирования кое-что стало настоящей проблемой - не утечка памяти, как сказал @pdriegen - проблема с доступной памятью.
Я изменяю свой код на это (и проверено на мобильном устройстве):
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()
И с кодом выше (по-видимому) я получаю byte () (массив) изображения для хранения в базе данных, используя dataSet.
В заключение: загрузка растрового объекта в memoryStream, плохая идея. Большое спасибо всем, кто нашел время, чтобы прочитать мою проблему, и особенно тем, кто публикует свой ответ.
Solution (if you need to show the image in a picture box):Через несколько недель это, вероятно, лучшее (бесплатное) решение: Реализуйте ImageHelper, как описано здесь:ImageHelper
Этот класс / пример использует пространство имен чертежей из OpenNetCF (http://www.opennetcf.com/)
Он прекрасно работает и решает мои проблемы с памятью, загружая большие растровые изображения в память, на самом деле мы загружаем миниатюру, поэтому размер в памяти значительно уменьшается и избегается проблема исключений OutOfMemory.
About Chris Tacke Я просто понимаю, что автор поста об ImageHelper и соучредителе OpenNetCF здесь, в stackoverflow, вот его профиль:https://stackoverflow.com/users/13154/ctacke