[VB.net] Changer l'image d'une PictureBox et sauvegarder se changement

Résolu
gege1505 Messages postés 54 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 7 août 2012 - 18 déc. 2011 à 13:55
gege1505 Messages postés 54 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 7 août 2012 - 18 déc. 2011 à 21:23
Bonjour, alors je vous explique mon cas, j'ai une Form, avec une PictureBox, qui contient une image par défaut dedans, mais je voudrait que l'utilisateur puisse changer et choisir une image, comme un avatar pour un jeu vidéo, chaque utilisateur mettra son image. Pour cela j'ai codé la fonction qui change le contenu de la PictureBox et qui enregistre le nouvel avatar dans le dossier racine, pour la prochaine utilisation du programme, par l'utilisateur. Donc au démarrage je voudrais charger cette image dans la PictureBox, et c'est là que se situe le drame.

Voici mon code:

Private Sub menu_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If System.IO.File.Exists("./avatar2.png") Then
            File.Copy("./avatar2.png", "./avatar.png")
            PictureBox7.Image = Image.FromFile("./avatar.png")
            File.Delete("./avatar2.png") ' L'erreur se situe ici
        ElseIf System.IO.File.Exists("./avatar.png") Then
            PictureBox7.Image = Image.FromFile("./avatar.png")
        End If
End Sub

    Private Sub Button100_Click(sender As System.Object, e As System.EventArgs) Handles Button100.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            Dim Fs As FileStream = New FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read)
            Dim Value() As Byte = New Byte(Fs.Length) {}
            Fs.Read(Value, 0, Fs.Length)
            Fs.Close()
            File.Copy(OpenFileDialog1.FileName, "./avatar2.png")
            PictureBox7.Image = Image.FromFile("./avatar2.png")
            If System.IO.File.Exists("./avatar.png") Then
                File.Delete("./avatar.png")
            End If
        End If
    End Sub


Voici mon erreur:
Le processus ne peut pas accéder au fichier 'D:\...\avatar2.png', car il est en cours d'utilisation par un autre processus.

Je ne peut pas supprimer l'image car la Form s'en sert, soit disant... Vu que juste avant je fais ceci "PictureBox7.Image = Image.FromFile("./avatar.png")" donc je ne comprend pas, si vous pouviez m'aider.

Merci beaucoup.

7 réponses

Utilisateur anonyme
18 déc. 2011 à 18:51
Bonsoir,

Tu ne charges pas l'image de la bonne manière dans le picturebox (celle-ci n'est pas libérée).
Charge la plutôt depuis un stream automatiquement fermé après utilisation par l'instruction Using :
Using monstream As New IO.FileStream(Application.StartupPath & "\avatar2.png", IO.FileMode.Open)
     PictureBox1.Image = Image.FromStream(monstream)
End Using
File.Delete(Application.StartupPath & "\avatar2.png")
3
cgandco Messages postés 219 Date d'inscription mercredi 26 octobre 2011 Statut Membre Dernière intervention 22 juin 2017 9
18 déc. 2011 à 14:22
Bonjour,

Je ne vois pas pourquoi, mais si tu supprimes les deux lignes (une à la fois) ça donne quoi ?

If System.IO.File.Exists("./avatar2.png") Then
            'File.Copy("./avatar2.png", "./avatar.png")
            'PictureBox7.Image = Image.FromFile("./avatar.png")
            File.Delete("./avatar2.png") ' L'erreur se situe ici
        ElseIf System.IO.File.Exists("./avatar.png") Then
            PictureBox7.Image = Image.FromFile("./avatar.png")
        End If


Bonne journée



Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
0
gege1505 Messages postés 54 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 7 août 2012
18 déc. 2011 à 15:13
Ben si j'enlève cette ligne là
PictureBox7.Image = Image.FromFile("./avatar.png")

C'est normal que je ne pourrais pas supprimer "avatar2.png" car ce sera encore celle là qui sera utilisé par ma PictureBox7 et non "avatar.png".
0
gege1505 Messages postés 54 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 7 août 2012
18 déc. 2011 à 15:26
J'ai aussi essayé le code suivant, qui est beaucoup plus simple, mais ne marche pas non plus :(

    Private Sub menu_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
           If System.IO.File.Exists("./avatar.png") Then
               PictureBox7.Image = Image.FromFile("./avatar.png")
           End If
    End Sub

    Private Sub Button100_Click(sender As System.Object, e As System.EventArgs) Handles Button100.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            Dim Fs As FileStream = New FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read)
            Dim Value() As Byte = New Byte(Fs.Length) {}
            Fs.Read(Value, 0, Fs.Length)
            Fs.Close()
            PictureBox7.Image = Nothing
            Delete()
            File.Copy(OpenFileDialog1.FileName, "./avatar.png")
            PictureBox7.Image = Image.FromFile("./avatar.png")
        End If
    End Sub


    Private Sub Delete()
        File.Delete("./avatar.png")
    End Sub


En théorie le "PictureBox7.Image = Nothing" devrait me permettre de faire n'importe quelle opération sur avatar.png, vu que je ne m'en sert plus... là je sèche vraiment.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
18 déc. 2011 à 17:26
Salut
j'ai copié ton code

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Try
      If System.IO.File.Exists(Application.StartupPath & "\avatar2.png") Then
                File.Copy(Application.StartupPath & "\avatar2.png", Application.StartupPath & "\avatar.png")
                PictureBox1.Image = Image.FromFile("./avatar.png")
                File.Delete(Application.StartupPath & "\avatar2.png") ' L'erreur se situe ici
            ElseIf System.IO.File.Exists(Application.StartupPath & "\avatar.png") Then
                PictureBox1.Image = Image.FromFile("./avatar.png")
            End If
  Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        

    End Sub



je n'ai pas eu d'erreur
je n'ai compris pourquoi tu ne charges pas directement avatar2 dans le picturebox ?
quelle est la taille d'avatar2 ?
0
gege1505 Messages postés 54 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 7 août 2012
18 déc. 2011 à 18:11
L'erreur survient lorsque je ferme l'application, que je la reouvre et que je veux rechanger l'image.
Le problème ne vient pas de la taille de l'image, j'y ai déjà pensé.
0
gege1505 Messages postés 54 Date d'inscription lundi 2 novembre 2009 Statut Membre Dernière intervention 7 août 2012
18 déc. 2011 à 21:23
Merci, c'était exactement ça, je désallouée pas l'image, mais je n'avais aucune idée de comment m'y prendre.
Merci encore banana32 !
0
Rejoignez-nous