ImageList上的VB.NET Out of Memory问题

时间:2015-02-08 16:49:16

标签: vb.net listview memory-management imagelist

编辑: 即使我在添加位图后添加dispose()End Using,我也会通过将图像加载到ImageList来获得 “Out of Memory” 错误ImageList中。

这是我的代码。

Function loadImage()
    Dim item As New ListViewItem

    imageList.ImageSize = New Size(45, 70)

    For Each value In arr
        If System.IO.File.Exists(value) Then
            Using img As New Bitmap(value)
                imageList.Images.Add(Image.FromHbitmap(img.GetHbitmap))
            End Using
            newListView.LargeImageList = imageList
            item = New ListViewItem(value)
            newListView.Items.Add(item)
            item.Name = value
            item.Tag = System.IO.Path.GetDirectoryName(value)
            newListView.Items(item.Index).ImageIndex = item.Index
        End If
    Next

    newListView.View = View.LargeIcon
    Return Nothing
End Function

我在arr上有96个值,包含图像路径,只显示其中的82个,然后发生了OOM错误。

也许我误用了Using声明或其他任何内容。我希望你能帮助我。谢谢!

1 个答案:

答案 0 :(得分:1)

[已解决]创建图像副本并将复制的图像调整为位图缩略图大小,然后将其添加到ImageList()。添加后,处理原始图像和位图副本。

我会发布代码以帮助其他有同样问题的人。

    Dim item As New ListViewItem

    imageList.ImageSize = New Size(80, 100)

    For Each value In arr
        If System.IO.File.Exists(value) Then
            Dim buffer As Byte() = File.ReadAllBytes(value)
            Dim stream As MemoryStream = New MemoryStream(buffer)

            Dim myBitmap As Bitmap = CType(Bitmap.FromStream(stream), Bitmap)
            Dim pixelColor As Color = myBitmap.GetPixel(50, 80)
            Dim newColor As Color = Color.FromArgb(pixelColor.R, pixelColor.G, pixelColor.B)

            myBitmap.SetPixel(0, 0, newColor)
            myBitmap = myBitmap.GetThumbnailImage(80, 100, Nothing, IntPtr.Zero)

            imageList.Images.Add(Image.FromHbitmap(myBitmap.GetHbitmap))

            myBitmap.Dispose()
            stream.Dispose()

            newListView.LargeImageList = imageList
            item = New ListViewItem(value)
            newListView.Items.Add(item)

            newListView.Items(item.Index).ImageIndex = item.Index
        End If
    Next

    newListView.View = View.LargeIcon

其中arr是图像路径目录的列表。