Bonjour,

Je dois télécharger plusieurs centaines d'images, les convertir en .png puis les sauver en local.
J'ai d'abord tenté ceci (mes connaissances sont ce qu'elles sont, merci pour votre compréhension ;-)):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
For i As Integer = 1 To 200
            Dim img As String = "https://lalydo.files.wordpress.com/2010/10/for-the-birds.jpg"
            Dim name As String = "newname" & i
            Dim bitmap As New BitmapImage()
            bitmap.BeginInit()
            bitmap.UriSource = New Uri(img)
            bitmap.EndInit()
 
            Dim encoder As PngBitmapEncoder = New PngBitmapEncoder()
            encoder.Frames.Add(BitmapFrame.Create(bitmap))
            Using filestream = New FileStream(destinationFolder & "\" & name & ".png", FileMode.Create)
                encoder.Save(filestream)
            End Using
Next
...pour me rendre compte que 200 images sont bel et bien créées..mais vide.

J'imagine que c'est parce que l'image n'a pas fini de se télécharger que l'on passe déjà à l'image suivante!!?

J'essaie alors de déporter le traitement dans un sub qui se lance une fois que l'image a fini d'être téléchargée

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Imports System.IO
Class MainWindow
    Dim destinationFolder As String = "C:\Test"
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
        If Not Directory.Exists(destinationFolder) Then Directory.CreateDirectory(destinationFolder)
        CollectBitmap()
    End Sub
    Sub CollectBitmap()
        For i As Integer = 1 To 200
            Dim img As String = "https://lalydo.files.wordpress.com/2010/10/for-the-birds.jpg"
            Dim name As String = "newname" & i
            Dim bitmap As New BitmapImage()
            bitmap.BeginInit()
            bitmap.UriSource = New Uri(img)
            bitmap.EndInit()
            '
            SaveImage(bitmap, name)
        Next
    End Sub
    Sub SaveImage(ByVal bitmap As BitmapImage, ByVal name As String)
        AddHandler bitmap.DownloadCompleted, New EventHandler(Sub(sender As Object, args As EventArgs)
                                                                  Dim encoder As PngBitmapEncoder = New PngBitmapEncoder()
                                                                  encoder.Frames.Add(BitmapFrame.Create(DirectCast(sender, BitmapImage)))
                                                                  Using filestream = New FileStream(destinationFolder & "\" & name & ".png", FileMode.Create)
                                                                      encoder.Save(filestream)
                                                                  End Using
                                                                  Label1.Content = name & " converted and saved"
                                                              End Sub)
    End Sub
End Class
Est-ce la bonne facon de faire, svp?
Si je comprends bien, il y a donc plusieurs (dizaines sans doute) d'images dont le traitement est lancé concurremment!?
Ne serais-ce pas mieux de télécharger la première, de faire le traitement, de sauver, puis de passer à la suivante?
Et surtout: comment pourrais je faire pour voir l'évolution du téléchargement avec une progressbar (et déjà s'assurer que Label1.Content est mis à jour, ce qui n'est pas le cas jusqu'à présent)

Merci pour tout aide