【发布时间】:2012-06-14 13:27: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(我的意思是在具有完整 .net 框架的 windows7/32bits 下)时,此代码运行良好,但是当我在具有 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
....
图像大小约为 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()
通过上面的代码(显然),我得到了图像的字节()(数组),并使用 dataSet 存储在数据库中。
结论:将位图对象加载到 memoryStream,这是个坏主意。 非常感谢所有花时间阅读我的问题的人,特别是那些发布答案的人。
解决方案(如果需要在图片框中显示图片):
几周后,这可能是最好的(免费)解决方案: 按照此处的说明实现 ImageHelper:ImageHelper
更新了指向 ImageHelper 的链接 https://opennetcf.com/2010/10/13/loading-parts-of-large-images-in-the-compact-framework/
此类/示例使用来自 OpenNetCF (http://www.opennetcf.com/) 的绘图命名空间
它很好用,它解决了我将大位图加载到内存中的内存问题,实际上我们加载了一个缩略图,因此内存中的大小大大减少并避免了 OutOfMemory 异常问题。
关于克里斯·塔克 我刚刚意识到关于 ImageHelper 和 OpenNetCF 的联合创始人的帖子的作者在 stackoverflow 上,这是他的个人资料:https://stackoverflow.com/users/13154/ctacke
更新链接 https://opennetcf.com/2010/10/13/loading-parts-of-large-images-in-the-compact-framework/
【问题讨论】:
标签: image memory-leaks bitmap compact-framework opennetcf