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

gege1505 54 Messages postés lundi 2 novembre 2009Date d'inscription 7 août 2012 Dernière intervention - 18 déc. 2011 à 13:55 - Dernière réponse : gege1505 54 Messages postés lundi 2 novembre 2009Date d'inscription 7 août 2012 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Utilisateur anonyme - 18 déc. 2011 à 18:51
3
Merci
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")

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 102 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
cgandco 219 Messages postés mercredi 26 octobre 2011Date d'inscription 22 juin 2017 Dernière intervention - 18 déc. 2011 à 14:22
0
Merci
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.
Commenter la réponse de cgandco
gege1505 54 Messages postés lundi 2 novembre 2009Date d'inscription 7 août 2012 Dernière intervention - 18 déc. 2011 à 15:13
0
Merci
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".
Commenter la réponse de gege1505
gege1505 54 Messages postés lundi 2 novembre 2009Date d'inscription 7 août 2012 Dernière intervention - 18 déc. 2011 à 15:26
0
Merci
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.
Commenter la réponse de gege1505
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 18 déc. 2011 à 17:26
0
Merci
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 ?
Commenter la réponse de cs_ShayW
gege1505 54 Messages postés lundi 2 novembre 2009Date d'inscription 7 août 2012 Dernière intervention - 18 déc. 2011 à 18:11
0
Merci
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é.
Commenter la réponse de gege1505
gege1505 54 Messages postés lundi 2 novembre 2009Date d'inscription 7 août 2012 Dernière intervention - 18 déc. 2011 à 21:23
0
Merci
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 !
Commenter la réponse de gege1505

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.