2015-02-08 57 views
1

編輯: 我收到一條「內存不足」的錯誤加載圖像到一個ImageList甚至當我把dispose()End Using將位圖後的ImageList 。VB.NET出

這是我的代碼。

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聲明或任何東西。我希望你能幫助我。謝謝!

+3

當然,您的圖片文件夾中的一百張照片可以很容易地消耗一千兆字節或兩個內存。 Kaboom在32位模式下運行時的應用程序。調整圖像大小以便它們不需要太多內存,但對於ListView來說足夠大,在將它們添加到ImageList之後進行處理,刪除抖動強制,以便程序以64位模式運行。 – 2015-02-08 17:20:55

+0

@HansPassant如何處理圖像?我在哪裏可以放置處置代碼? (對不起,這裏是初學者)。還有一件事,你的意思是調整寬度和高度來調整大小? – slverstone 2015-02-08 17:27:22

+0

你的圖像有多大?多少個像素?將圖像調整爲適合您的列表視圖的縮略圖大小的方法。您的列表視圖不需要百萬像素圖像 – tofi9 2015-02-09 03:40:25

回答

0

[已解決]創建圖像的副本,並將複製的圖像調整爲位圖縮略圖大小,然後將其添加到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是圖像路徑目錄的列表。