OutOfMemoryException异常装载大图像的Bitmap对象与精简框架(OutOfMem

2019-06-25 12:04发布

我有一个内存泄漏问题。

我有一个这样的代码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中/与.NET Framework全功能32位),但是当我在用的WindowsMo​​bile 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
....

图像大小为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()

并与上述代码(显然)我得到一个字节()中使用的数据集的数据库,以存储图像的(阵列)。

结论:加载一个位图对象的MemoryStream,坏主意。 非常感谢大家谁需要它的时间来阅读我的问题,特别是那些谁张贴自己的答案。

解决方案(如果你需要显示在一个图片框的图像):

几个星期之后,这可能是最好的(免费)的解决方案:如在此说明的实施ImageHelper: ImageHelper

这个类/样品从OpenNetCF使用Drawing命名空间( http://www.opennetcf.com/ )

它的伟大工程,它解决了我的记忆烦恼加载大位图到内存中,其实我们加载一个缩略图,所以在内存中的大小显着减小,避免了内存不足的异常问题。

关于克里斯·塔克我只是意识到,张贴关于ImageHelper和OpenNetCF的联合创始人它在这里的计算器,这里的作者是他的个人资料: https://stackoverflow.com/users/13154/ctacke

Answer 1:

我不相信这个问题是内存泄漏。 相反,问题是缺乏可用内存。

即使压缩后的图像大小为200KB,当你加载它,因为它会被解压缩并存储在本机位图格式存储的位图。 给定一个高度和每个1500px宽度,并假设32bpp的(不指定时默认值)的位图格式,你看着分配的内存9MB

1500 * 1500 * 4 = 9MB。

鉴于存在于移动设备OS(32MB /处理 - 由系统DLL分配的空间)的内存的限制,很可能在存储器紧缩场景。 它是未知的对我有什么其他的内存是由正运行在这段代码的应用程序分配的,当然。

尝试在同一设备上相同的代码具有较小图像。 你应该看到它执行罚款。



Answer 2:

您泄漏GDI处理,包裹流和位图的使用条款。

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

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

End Sub


文章来源: OutOfMemoryException loading big image to Bitmap object with the Compact Framework