编辑:
即使我在添加位图后添加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
声明或其他任何内容。我希望你能帮助我。谢谢!
答案 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
是图像路径目录的列表。