Défilement d'images. 1.jpeg -> 2.jpeg -> 3.jpeg (sans connaitre le nombre de fi

Signaler
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012
-
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012
-
Bien le bonjour cher programmeur,

Dans un précédent poste, j'apprenais à faire défiler des images dans un picturebox en déclarant chaque image dans une varible, tout ça en début de code.
Aujourd'hui, je me créer un petit programme de capture d'écran multiples.
J'ai donc mis en place la possibilité de choisir le nombre d'images par seconde, les images enregistré au format jpeg s'appellent 1.jpeg, 2.jpeg,3.jpeg etc..
Je pourrai créer XXXX variable en début de projet mais je ne suis pas sur que cela sois la meilleurs solution.

Ma question est donc, comment faire en sorte de déclarer mes images sans en connaitre le nombre total ? (La première s'appellera toujours 1.jpeg)

Et donc comment les faire défiler vu que je ne connaitrais pas non plus le nom des variables?

En attendant des réponses, je m'y replonge !

Bonne journée et merci d'avance.

26 réponses

Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Si ça vous intéresse de voir mon prog :

Public Class Form1
    Dim sPathUser As String
    Public Shared Function CapturerBureauWindows() As Bitmap
        Dim tailleTotale As Rectangle
        ' Taille totale du bureau de Windows
        Dim image As Bitmap
        ' Capture de l'écran
        ' Récupérer la taille totale du bureau de Windows
        tailleTotale = Screen.AllScreens(0).Bounds
        For i As Integer = 1 To Screen.AllScreens.Length - 1
            tailleTotale = Rectangle.Union(tailleTotale, Screen.AllScreens(i).Bounds)
        Next

        ' Créer une image de la taille du bureau de Windows
        image = New Bitmap(tailleTotale.Width, tailleTotale.Height)

        ' Créer un Graphics à partir de l'image et faire la capture dans celui-ci
        Using g As Graphics = Graphics.FromImage(image)
            g.CopyFromScreen(tailleTotale.Location, Point.Empty, tailleTotale.Size)
        End Using

        Return image
    End Function



    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        sPathUser = Environ$("USERPROFILE")
        Dim dossierlocal = sPathUser & "\AppData\Roaming\RecordScreen\Images"
        BackgroundWorker1.WorkerSupportsCancellation = True
        Dim capture As Bitmap
        capture = CapturerBureauWindows()
        Dim captur As Object
        captur = Label2.Text
        capture.Save(dossierlocal & captur & ".jpg")
    End Sub

    Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged
        If (ComboBox1.Text.Trim() = "") Then
            MsgBox("Indiquez le nombre d'images par seconde")
            If CheckBox1.Checked = True Then
                CheckBox2.BackColor = Color.Red
                Label2.Text = "0"
            End If
        ElseIf CheckBox2.Checked = True Then
            CheckBox2.BackColor = Color.Lime
            ComboBox1.Enabled = False
            CheckBox2.Text = "Stopper la capture"
            Timer1.Interval = 1000 / ComboBox1.Text
            Timer1.Start()
            Timer2.Interval = 1000 / ComboBox1.Text
            Timer2.Start()
        ElseIf CheckBox2.Checked = False Then
            CheckBox2.BackColor = Color.Red
            BackgroundWorker1.CancelAsync()
            ComboBox1.Enabled = True
            CheckBox2.Text = "Démarrer la capture"
            Timer1.Enabled = False
            Timer1.Stop()
            Timer2.Enabled = False
            Timer2.Stop()
            Label2.Text = "0"
        End If
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Label2.Text += 1
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        sPathUser = Environ$("USERPROFILE")
        Dim dossierlocal = sPathUser & "\AppData\Roaming\RecordScreen"
        If My.Computer.FileSystem.DirectoryExists(dossierlocal) = True Then
            My.Computer.FileSystem.DeleteDirectory(dossierlocal, FileIO.DeleteDirectoryOption.DeleteAllContents)
        Else
            MsgBox("Le dossier à déjà était supprimé.")
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        sPathUser = Environ$("USERPROFILE")
        Dim dossierlocal = sPathUser & "\AppData\Roaming\RecordScreen\Images"

        If System.IO.Directory.Exists(dossierlocal) = False Then
            Try
                System.IO.Directory.CreateDirectory(dossierlocal)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

        End If
    End Sub

    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.Checked = True Then
            If CheckBox2.Checked = True Then
                CheckBox1.Text = "Reprendre"
                CheckBox1.BackColor = Color.Lime
                Timer1.Enabled = False
                Timer1.Stop()
                Timer2.Enabled = False
                Timer2.Stop()
            Else
                MsgBox("Vous n'avez pas démarré la capture")
            End If
        ElseIf CheckBox1.Checked = False Then
            If CheckBox2.Checked = True Then
                CheckBox1.BackColor = Color.Red
                CheckBox1.Text = "Pause"
                Timer1.Interval = 1000 / ComboBox1.Text
                Timer1.Start()
                Timer2.Interval = 1000 / ComboBox1.Text
                Timer2.Start()
            Else
                MsgBox("Vous n'avez pas démarré la capture")
            End If
        End If
    End Sub
End Class



ps:Désolé pour les non renommage des objets..

Bonsoir,

Tu peux te servir (par exemple) de la classe DirectoryInfo et de sa méthode GetFiles qui renvoie une collection de FileInfo.
Jette un coup d'oeil sur msdn.
Tu peux aussi utiliser FileSystemWatcher (disponible dans ta boîte à outils sous forme de composant à rajouter à ton formulaire). Avec cet outil, tu dispose d'événements te permettant de surveiller la création, modif etc... d'un fichier appartenant à un dossier défini par toi-même.

Bonne prog.
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Bonsoir banana32,

Merci je vais y jeter un oeil.

Sinon mon programme monte a 700.000Ko de mémoire, redescend, puis remonte a 700.000ko, avec 25 images par seconde.
J'ai retiré le backgroundworker et mis le code dans un timer la mémoire utilisé est la même.
Tout à l'heure j'ai mis 60 images par secondes, mon pc m'as fait un écran bleu j'ai du redémarrer..
Il y a t-il moyen de ne pas utilisé autant de mémoire ?

Merci.

Je ne maîtrise pas les fuites de mémoires mais puisque ta fonction CapturerBureauWindows est un bitmap, au lieu de déclarer un nouveau bitmap 'capture' ecris plutôt directement :
CapturerBureauWindows().Save(IO.path.combine(dossierlocal , captur & ".jpg")

Si ton problème persiste, poste un nouveau sujet car ça n'a rien à voir avec la question.

Autre chose; ceci n'est pas correct :
Dim captur As Object
captur = Label2.Text

As-tu activé Option Strict ? Sûrement pas !
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Ok merci, ça ne change rien mais je verrai ça plus tard, pour l'instant je vais plus me pencher sur directoryinfo.
J'ai reussi à afficher chaque nom de fichier dans un msgbox donc je ne devrai plus être très loin.
Je te tiens au courant.

Bonne prog.
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Bonsoir,

Je viens de l'activer (il se désactive à chaque fois que je recréer un programme.
En l'activant il ne m'as pas affiché d'erreur dessus.
J'ai tout de même remplacé par ceci :

        Dim captur As String
        captur = Label2.Text


En revanche il m'indique une erreur la dessus :

Label2.Text += 1


Mais je pense avoir la solution.
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Label2.Text = CStr(CSng(Label2.Text) + CSng(1))
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Voila j'ai plus d'erreur :

Public Class Form1
    Dim sPathUser As String
    Public Shared Function CapturerBureauWindows() As Bitmap
        Dim tailleTotale As Rectangle
        ' Taille totale du bureau de Windows
        Dim image As Bitmap
        ' Capture de l'écran
        ' Récupérer la taille totale du bureau de Windows
        tailleTotale = Screen.AllScreens(0).Bounds
        For i As Integer = 1 To Screen.AllScreens.Length - 1
            tailleTotale = Rectangle.Union(tailleTotale, Screen.AllScreens(i).Bounds)
        Next

        ' Créer une image de la taille du bureau de Windows
        image = New Bitmap(tailleTotale.Width, tailleTotale.Height)

        ' Créer un Graphics à partir de l'image et faire la capture dans celui-ci
        Using g As Graphics = Graphics.FromImage(image)
            g.CopyFromScreen(tailleTotale.Location, Point.Empty, tailleTotale.Size)
        End Using

        Return image
    End Function

    Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CBplaystop.CheckedChanged
        If (ComboBox1.Text.Trim() = "") Then
            MsgBox("Indiquez le nombre d'images par seconde")
            If CBpausereprendre.Checked = True Then
                CBplaystop.BackColor = Color.Lime
                Label2.Text = "0"
            End If
        ElseIf CBplaystop.Checked = True Then
            CBplaystop.BackColor = Color.Red
            ComboBox1.Enabled = False
            CBpausereprendre.Enabled = True
            CBplaystop.Text = "Stopper la capture"
            Timer1.Interval = CInt(CStr(CSng(1000) / CSng(ComboBox1.Text)))
            Timer1.Start()
            Timer2.Interval = CInt(CStr(CSng(1000) / CSng(ComboBox1.Text)))
            Timer2.Start()
        ElseIf CBplaystop.Checked = False Then
            CBplaystop.BackColor = Color.Red
            ComboBox1.Enabled = True
            CBpausereprendre.BackColor = Color.Lime
            CBpausereprendre.Enabled = False
            CBpausereprendre.Text = "Pause"
            CBplaystop.Text = "Démarrer la capture"
            Timer1.Enabled = False
            Timer1.Stop()
            Timer2.Enabled = False
            Timer2.Stop()
            Label2.Text = "0"
        End If
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        sPathUser = Environ$("USERPROFILE")
        Dim dossierlocal = sPathUser & "\AppData\Roaming\RecordScreen\Images"
        Dim captur As String
        captur = Label2.Text
        CapturerBureauWindows().Save(IO.Path.Combine(dossierlocal, captur & ".jpg"))
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Label2.Text = CStr(CSng(Label2.Text) + CSng(1))
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        sPathUser = Environ$("USERPROFILE")
        Dim dossierlocal = sPathUser & "\AppData\Roaming\RecordScreen"
        If My.Computer.FileSystem.DirectoryExists(dossierlocal) = True Then
            My.Computer.FileSystem.DeleteDirectory(dossierlocal, FileIO.DeleteDirectoryOption.DeleteAllContents)
        Else
            MsgBox("Le dossier à déjà était supprimé.")
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        CBpausereprendre.Enabled = False
        sPathUser = Environ$("USERPROFILE")
        Dim dossierlocal = sPathUser & "\AppData\Roaming\RecordScreen\Images"
        If System.IO.Directory.Exists(dossierlocal) = False Then
            Try
                System.IO.Directory.CreateDirectory(dossierlocal)
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
    End Sub

    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CBpausereprendre.CheckedChanged
        If CBpausereprendre.Checked = True Then
            If CBplaystop.Checked = True Then
                CBpausereprendre.Text = "Reprendre"
                CBpausereprendre.BackColor = Color.Red
                Timer1.Enabled = False
                Timer1.Stop()
                Timer2.Enabled = False
                Timer2.Stop()
            Else
                MsgBox("Vous n'avez pas démarré la capture")
            End If
        ElseIf CBpausereprendre.Checked = False Then
            If CBplaystop.Checked = True Then
                CBpausereprendre.BackColor = Color.Lime
                CBpausereprendre.Text = "Pause"
                Timer1.Interval = CInt(CStr(CSng(1000) / CSng(ComboBox1.Text)))
                Timer1.Start()
                Timer2.Interval = CInt(CStr(CSng(1000) / CSng(ComboBox1.Text)))
                Timer2.Start()
            Else
                MsgBox("Vous n'avez pas démarré la capture")
            End If
        End If
    End Sub

    Private Sub ApperçuDuFilmToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ApperçuDuFilmToolStripMenuItem.Click
        Apperçu.Show()
    End Sub
End Class

CInt, CStr et leur bande de potes sont obsolète.
Il te reste à désactiver l'import automatique de Microsoft.VisualBasic (décoche la case dans les options du projet). Corrige ensuite les erreurs.
Utilise la classe Convert.
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Rolala la galère lol.
Comment activer option strict et desactiver microsoft visual basic a chaque démarrage de VB ?

J'ai pas d'erreur sur ce que tu viens de me dire en revanche j'en est la dessus :

   sPathUser = Environ$("USERPROFILE")

sur Environ$

Et là dessus :

FileIO.DeleteDirectoryOption.DeleteAllContents)

Sur FileIo
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

sPathUser = Environment.GetEnvironmentVariable("USERSPROFILE")

De ce coté c'est bon.
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Sans le S à USER lol.
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Delete(dossierlocal)

Plus d'erreur sur FileIo
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

Fausse alerte mon programme ne réagi plus à la croix, donc ne supprime plus le dossier à la fermeture.
Pourtant avec cette même méthode il créé le dossier.

    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        sPathUser = Environment.GetEnvironmentVariable("USERPROFILE")
        Dim dossierlocal = sPathUser & "\AppData\Roaming\RecordScreen"
        If My.Computer.FileSystem.DirectoryExists(dossierlocal) = True Then
            Delete(dossierlocal)
        Else
            MessageBox.Show("Le dossier à déjà était supprimé.")
        End If
    End Sub

Ce sont de bonnes habitudes de programmation à prendre.
Dans le menu outils / options / coche afficher tous les paramètres.
Valeurs par défaut VB / coche option strict on

Prefere FormClosing plutôt que FormClosed
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

J'ai essayé les deux ça supprime plus mon dossier.
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        sPathUser = Environment.GetEnvironmentVariable("USERPROFILE")
        Dim dossierlocal = sPathUser & "\AppData\Roaming\RecordScreen"
        If My.Computer.FileSystem.DirectoryExists(dossierlocal) Then
            Try
                System.IO.Directory.Delete(dossierlocal)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End If
    End Sub


Le dossier n'est pas vide.
Messages postés
261
Date d'inscription
dimanche 23 mai 2004
Statut
Membre
Dernière intervention
22 septembre 2012

        My.Computer.FileSystem.DeleteDirectory(dossierlocal, Microsoft.VisualBasic.FileIO.DeleteDirectoryOption.DeleteAllContents)


ça peut fonctionner comme ceci mais comme tu m'as dis que Microsoft VisualBasic n'est pas bon...

Pour les calculs ça fonctionne comme ça et je ne sais pas faire autrement.