Partage
  • Partager sur Facebook
  • Partager sur Twitter

[VB.net] Changer l'image d'un PictureBox

Changer image d'un PictureBox, et sauvegarder ce changement

Sujet résolu
Anonyme
16 décembre 2011 à 19:11:56

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.
  • Partager sur Facebook
  • Partager sur Twitter
17 décembre 2011 à 8:06:14

Bonjour,

Moi j'aurais plutot créé un fichier "saveprofil" avec le chemin de l'image et un "dim Imageprofil as string = cheminpardefaut"
Ce chemin serait sauvegardé au moment de la premiere utilisation et chargé a chaque fois en changeant "Imageprofil"
Du coup il faudrait "picturebox7 .....fromfile(imageprofil)

J'utilise enormement ce systeme car je peux ouvrir un fichier avec "streamreader" et le fermer avec un ".close".

Sinon, j'ai remarqué a l'epoque que si tu cré une fonction "deletefichier" avec "file.delete...." uniquement.
Le fait de sortir de ton sub pricipal devrait resoudre le probleme.

Voila.@+
  • Partager sur Facebook
  • Partager sur Twitter
17 décembre 2011 à 11:42:32

Je pense que l'erreur viens car au moment où le Delete() se fait,tu es entrain de lire la dite image en même temps car j'ai tester ton code avec une autre image chez moi et ça fonctionne parfaitement.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
17 décembre 2011 à 22:57:20

Citation : brucelee410

Je pense que l'erreur viens car au moment où le Delete() se fait,tu es entrain de lire la dite image en même temps car j'ai tester ton code avec une autre image chez moi et ça fonctionne parfaitement.


Ben oui, c'est ce que j'ai dis, je ne peux pas supprimer l'image car la Form s'en sert, mais juste avant je fais ceci "PictureBox7.Image = Image.FromFile("./avatar.png")" donc je ne me sert plus de l'image que je veux supprimer, donc je ne comprend pas, si vous pouviez m'aider.

Citation : jcdioux

Sinon, j'ai remarqué a l'epoque que si tu cré une fonction "deletefichier" avec "file.delete...." uniquement. Le fait de sortir de ton sub pricipal devrait resoudre le probleme.


J'ai essayé, et le fait d'appeler une autre fonction et de sortir du Sub, ne m'aide pas, pour lui je me sers toujours de l'image.

Sinon j'ai aussi essayé avec "PictureBox7.Image = Nothing" Mais ça ne change rien, pour lui ma PictureBox se sert toujours de l'image, pourtant je viens de lui dire de mettre "rien" dedans, mais non --'
  • Partager sur Facebook
  • Partager sur Twitter
18 décembre 2011 à 12:20:50

Non tu ne comprends pas, chez moi j'ai aucun problème avec ton code.Je pense en fait que tu avais l'image d'ouverte sur ton bureau au moment du Delete() et non avec ton programme.Où alors c'est que tu as un autre composant qui prend cette image que tu ne nomme pas dans ton code.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
18 décembre 2011 à 13:20:11

Non, je vous assure aucun autre programme se servant de l'image n'est ouvert en parallèle, je pense vraiment que le processus dont il parle est mon programme VB, j'ai maintenant 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.
  • Partager sur Facebook
  • Partager sur Twitter
18 décembre 2011 à 20:12:02

Salut,

essai de faire ca avec un fichier qui sauve le nom de ton image.
Puis lire ce fichier des que tu en as besoin.
Ca sera plus simple.

ou alors delete apres etre sorti de ton load.(a la page suivante par exemple ou sur un bouton quitter)

@+
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
18 décembre 2011 à 21:04:42

En fait je ne chargeais pas l'image de la bonne manière dans la PictureBox, du coup celle-ci n'était pas libérée. Avec un stream, ça marche nickel !
Using monstream As New IO.FileStream("./avatar.png", IO.FileMode.Open)
     PictureBox1.Image = Image.FromStream(monstream)
End Using


Maintenant l'image est désallouée automatiquement à la fin du Using, et je peux faire mon Delete(), tranquille.

En tout cas merci à tous pour votre aide.
  • Partager sur Facebook
  • Partager sur Twitter
9 juillet 2013 à 20:52:42

Pourrais-tu donner le code final? Je ne sais pas où placer le bout de code indiqué dans le dernier message.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
11 juillet 2013 à 9:00:06

Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention plus facilement. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

Déterrage

Bonjour,

Tu as répondu à un sujet ancien dont il est peu probable que l'auteur ait encore de l'intérêt à le lire (ou que le problème existe encore). Il n'est pas recommandé de remonter un sujet ancien pour poser une question ou pour apporter une réponse au problème.

Je ferme donc ce sujet (et t'invite à ouvrir un sujet propre à ta demande s'il s'agissait d'une question). :)

NB: Les règles du site exigent par ailleurs de faire un minimum de recherche avant de poster une question.

Merci de ta compréhension.

Arius.

  • Partager sur Facebook
  • Partager sur Twitter