You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataGridView加载图片时出现Out of Memory Error问题求助

问题根源与修复方案

核心问题

  1. 未释放原始图片资源:Image.FromFile加载的原始Image对象被覆盖后未调用Dispose(),导致GDI+资源无法回收,持续占用内存。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:11:10