Advertisement
3DotDev

Images Lazy Loading

Sep 23rd, 2023
1,298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 5.15 KB | None | 0 0
  1. Imports System.ComponentModel
  2. Imports System.IO
  3. Imports System.Windows.Forms
  4.  
  5. Public Class Form1
  6.     Private ImageFolderPath As String = "Chemin_vers_le_dossier_des_images"
  7.     Private ImageList As New ImageList()
  8.     Private Thumbnails As New List(Of ImageInfo)()
  9.     Private Loading As Boolean = False
  10.     Private WithEvents backgroundWorker As New BackgroundWorker()
  11.  
  12.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  13.         ListView1.View = View.LargeIcon
  14.         ListView1.LargeImageList = ImageList
  15.  
  16.         ' Gérez le défilement pour charger les images à la demande.
  17.         AddHandler ListView1.Scroll, AddressOf ListView1_Scroll
  18.  
  19.         ' Configurez le BackgroundWorker.
  20.         backgroundWorker.WorkerReportsProgress = True
  21.         backgroundWorker.WorkerSupportsCancellation = True
  22.  
  23.         ' Chargez les images initiales (par exemple, les 50 premières images).
  24.         LoadInitialImages(50)
  25.     End Sub
  26.  
  27.     Private Sub ListView1_Scroll(sender As Object, e As ScrollEventArgs)
  28.         ' Chargez plus d'images lorsque l'utilisateur fait défiler.
  29.         If Not Loading AndAlso e.NewValue + ListView1.ClientSize.Height >= ListView1.Items.Count * ListView1.Items(0).Bounds.Height Then
  30.             LoadMoreImages(50)
  31.         End If
  32.     End Sub
  33.  
  34.     Private Sub LoadInitialImages(count As Integer)
  35.         For i As Integer = 0 To count - 1
  36.             Dim imagePath As String = Path.Combine(ImageFolderPath, $"image_{i}.jpg")
  37.             If File.Exists(imagePath) Then
  38.                 Dim thumbnail As Image = GetThumbnail(imagePath)
  39.                 If thumbnail IsNot Nothing Then
  40.                     ImageList.Images.Add(thumbnail)
  41.                     Thumbnails.Add(New ImageInfo() With {.FilePath = imagePath, .Thumbnail = thumbnail})
  42.                 End If
  43.             End If
  44.         Next
  45.  
  46.         ' Ajoutez les images à la ListView.
  47.         For Each imageInfo As ImageInfo In Thumbnails
  48.             Dim item As New ListViewItem()
  49.             item.ImageIndex = ImageList.Images.Count - 1
  50.             ListView1.Items.Add(item)
  51.         Next
  52.     End Sub
  53.  
  54.     Private Sub LoadMoreImages(count As Integer)
  55.         ' Utilisez le BackgroundWorker pour charger les images en arrière-plan.
  56.         If Not backgroundWorker.IsBusy Then
  57.             Loading = True
  58.             backgroundWorker.RunWorkerAsync(count)
  59.         End If
  60.     End Sub
  61.  
  62.     Private Sub backgroundWorker_DoWork(sender As Object, e As DoWorkEventArgs) Handles backgroundWorker.DoWork
  63.         Dim count As Integer = CInt(e.Argument)
  64.         Dim startIndex As Integer = Thumbnails.Count
  65.  
  66.         For i As Integer = startIndex To startIndex + count - 1
  67.             If backgroundWorker.CancellationPending Then
  68.                 e.Cancel = True
  69.                 Exit For
  70.             End If
  71.  
  72.             Dim imagePath As String = Path.Combine(ImageFolderPath, $"image_{i}.jpg")
  73.             If File.Exists(imagePath) Then
  74.                 Dim thumbnail As Image = GetThumbnail(imagePath)
  75.                 If thumbnail IsNot Nothing Then
  76.                     Thumbnails.Add(New ImageInfo() With {.FilePath = imagePath, .Thumbnail = thumbnail})
  77.                     backgroundWorker.ReportProgress(i)
  78.                 End If
  79.             End If
  80.         Next
  81.     End Sub
  82.  
  83.     Private Sub backgroundWorker_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles backgroundWorker.ProgressChanged
  84.         ' Ajoutez les images chargées à la ListView.
  85.         Dim index As Integer = e.ProgressPercentage
  86.         Dim imageInfo As ImageInfo = Thumbnails(index)
  87.         ImageList.Images.Add(imageInfo.Thumbnail)
  88.         Dim item As New ListViewItem()
  89.         item.ImageIndex = ImageList.Images.Count - 1
  90.         ListView1.Items.Add(item)
  91.     End Sub
  92.  
  93.     Private Sub backgroundWorker_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles backgroundWorker.RunWorkerCompleted
  94.         Loading = False
  95.     End Sub
  96.  
  97.     Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
  98.         ' Annulez le BackgroundWorker s'il est en cours d'exécution.
  99.         If backgroundWorker.IsBusy Then
  100.             backgroundWorker.CancelAsync()
  101.         End If
  102.     End Sub
  103.  
  104.     Private Function GetThumbnail(imagePath As String) As Image
  105.         ' Code pour créer et retourner une miniature de l'image.
  106.         ' Par exemple, vous pouvez utiliser la classe Bitmap pour redimensionner l'image.
  107.         ' Assurez-vous de gérer les erreurs et de libérer les ressources correctement.
  108.         Try
  109.             Dim originalImage As New Bitmap(imagePath)
  110.             Dim thumbnail As New Bitmap(100, 100) ' Redimensionnez la miniature selon vos besoins.
  111.             Using g As Graphics = Graphics.FromImage(thumbnail)
  112.                 g.DrawImage(originalImage, 0, 0, thumbnail.Width, thumbnail.Height)
  113.             End Using
  114.             originalImage.Dispose()
  115.             Return thumbnail
  116.         Catch ex As Exception
  117.             Return Nothing
  118.         End Try
  119.     End Function
  120. End Class
  121.  
  122. Public Class ImageInfo
  123.     Public Property FilePath As String
  124.     Public Property Thumbnail As Image
  125. End Class
  126.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement