DataGridView加载图片时出现Out of Memory Error问题求助
问题根源与修复方案
核心问题
- 未释放原始图片资源:
Image.FromFile加载的原始Image对象被覆盖后未调用Dispose(),导致GDI+资源无法回收,持续占用内存。 - 32位程序内存限制:32位.NET应用默认最大可用内存约1.5GB,大量未释放的图片资源会快速耗尽内存。
修复步骤
1. 释放原始图片资源
修改循环内的代码,使用Using语句自动释放原始Image:
sDir = IO.Directory.GetFiles(sPath, "*.jpg") For Each s In sDir Using originalImg As Image = Image.FromFile(s) Dim scaledImg As Image = ScaleImage(originalImg, 100, 100) Dim row = Dgv.Rows(Dgv.Rows.Add) row.Cells(0).Value = scaledImg row.Cells(1).Value = s End Using Next
2. 优化ScaleImage函数
简化比例计算逻辑,同时保证缩放质量并释放临时资源:
Public Function ScaleImage(OldImage As Image, TargetHeight As Integer, TargetWidth As Integer) As System.Drawing.Image If OldImage.Width = 0 OrElse OldImage.Height = 0 Then Return Nothing End If Dim ratio As Double = Math.Min(TargetWidth / OldImage.Width, TargetHeight / OldImage.Height) Dim newWidth As Integer = CInt(OldImage.Width * ratio) Dim newHeight As Integer = CInt(OldImage.Height * ratio) Dim scaledBitmap As New Bitmap(newWidth, newHeight) Using g As Graphics = Graphics.FromImage(scaledBitmap) g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic g.DrawImage(OldImage, 0, 0, newWidth, newHeight) End Using Return scaledBitmap End Function
3. 启用DataGridView虚拟模式(可选)
若图片数量持续增加,开启VirtualMode实现按需加载,避免一次性占用大量内存:
- 设置
Dgv.VirtualMode = True - 处理
CellValueNeeded事件,仅在当前行可见时加载并缩放对应图片
4. 切换到64位程序(可选)
在项目属性中将目标平台改为x64,直接突破32位应用的内存上限限制。
内容的提问来源于stack exchange,提问作者Phil91
相关产品推荐
相关产品推荐

