OutOfMemoryException carregando uma imagem grande no objeto Bitmap com o Compact Framework
Eu tenho um problema com um vazamento de memória.
Eu tenho esse código em umbutton_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
Este código funciona muito bem quando eu estou executando o .exe no meu laptop (eu quero dizer em windows7 / 32bits com o framework completo .net), mas quando eu executar o aplicativo em um dispositivo com o WindowsMobile 6.1 o aplicativo lança essa exceção:
SmartDeviceProject22.exe
OutOfMemoryException
a
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
....
O tamanho da imagem é de cerca de 200kb e a largura e altura em torno de 1500px. Detalhes da imagem:
Dimensão: 1536x2048Resolução Horizontal: 72dpiResolução Horizontal: 72dpiProfundidade de bits: 24Unidade de resolução: 2Representação de cores: sRGB -Qualquer ajuda será muito apreciada.
Eu tento o código do @asawyer até mesmo remover TODO o código, referência, etc e o problema persistir, acho que é algo sobre a largura / altura da imagem ou com o framework compacto.
Algum outro conselho?
Solução e explicação do problema Bem, depois de testar algumas coisas, o problema real não era um vazamento de memória, assim como @pdriegen disse que é um problema de memória disponível.
Eu mudo meu código para isso (e testado no dispositivo móvel):
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()
E com o código acima (aparentemente) eu recebo um byte () (array) da imagem para armazenar no banco de dados usando dataSet.
Em conclusão: carregar um objeto de bitmap para memoryStream, má ideia. Muito obrigado a todos que dedicam tempo a ler o meu problema e, especialmente, aqueles que publicam a sua resposta.
Solução (se você precisar mostrar a imagem em uma caixa de imagem):Depois de algumas semanas, esta é provavelmente a melhor solução (de graça): Implemente um ImageHelper como explicado aqui:ImageHelper
Esta classe / amostra usa o Drawing NameSpace do OpenNetCF (http://www.opennetcf.com/)
Ele funciona muito bem e resolve os problemas de memória que carregam grandes bitmaps na memória. Na verdade, carregamos uma miniatura, portanto, o tamanho da memória é reduzido consideravelmente e evitamos o problema de exceção OutOfMemory.
Sobre Chris Tacke Acabei de perceber que o autor do post sobre ImageHelper e co-fundador do OpenNetCF está aqui no stackoverflow, aqui está o perfil dele:https://stackoverflow.com/users/13154/ctacke