OutOfMemoryException使用Compact Framework将大图像加载到Bitmap对象

All*_*nde 4 memory-leaks compact-framework image bitmap opennetcf

我有内存泄漏的问题.

我有这个代码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
Run Code Online (Sandbox Code Playgroud)

当我在我的笔记本电脑上运行.exe时,这段代码工作得很好(我的意思是在带有完整.net框架的windows7/32bits下)但是当我在装有WindowsMo​​bile 6.1的设备上运行应用程序时,应用程序会抛出此异常:

SmartDeviceProject22.exe
OutOfMemoryException
Run Code Online (Sandbox Code Playgroud)

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
....
Run Code Online (Sandbox Code Playgroud)

图像大小约为200kb,宽度和高度约为1500px.图片细节:

  • 尺寸:1536x2048
  • 水平分辨率:72dpi
  • 水平分辨率:72dpi
  • 比特深度:24
  • 分辨率单位:2
  • 颜色表示:sRGB -

任何帮助,将非常感激.

我尝试@asawyer的代码甚至删除所有的代码,引用等问题保持,我想这是关于图像的宽度/高度或紧凑的框架.

还有其他建议吗?

问题的解决方案和解释 在测试完成后,真正的问题不是内存泄漏,正如@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()
Run Code Online (Sandbox Code Playgroud)

使用上面的代码(显然)我得到一个image()(数组)的图像,使用dataSet存储在数据库中.

总之:将一个位图对象加载到memoryStream,不好主意.非常感谢每个花时间阅读我的问题的人,特别是那些发表他们答案的人.

解决方案(如果您需要在图片框中显示图像):

几周后,这可能是最好的(免费)解决方案:实现ImageHelper,如下所述:ImageHelper

此类/示例使用OpenNetCF中的Drawing NameSpace(http://www.opennetcf.com/)

它运行良好,它解决了我的内存问题,将大位图加载到内存,实际上我们加载缩略图,因此内存中的大小大大减少,并避免OutOfMemory异常问题.

关于Chris Tacke 我刚才意识到关于ImageHelper和OpenNetCF联合创始人的帖子的作者在stackoverflow,这是他的个人资料:https://stackoverflow.com/users/13154/ctacke

pdr*_*gen 5

我不相信问题是内存泄漏.相反,问题是缺乏可用的内存.

即使压缩图像大小为200kb,当您将其作为位图加载时,它将被解压缩并以本机Bitmap格式存储在内存中.给定每个1500px的高度和宽度,并假设位图格式为32bpp(未指定时的默认值),您将看到9MB的已分配内存

1500*1500*4 = 9MB.

考虑到移动设备操作系统中存在的内存限制(32MB /进程 - 由系统dll分配的空间),您很可能处于内存紧缩情况中.我当然不知道你正在运行此代码的应用程序分配了哪些其他内存.

使用较小的图像在同一设备上尝试相同的代码.你应该看到它执行得很好.