Libérer le fichier JPG après un Image.Fronfile [Résolu]

- - Dernière réponse :  ROBIN1 - 21 déc. 2012 à 16:57
Bonsoir à tous. La réponse est certainement sur le forum mais je peine à la trouver ...
Je suis sous Visual 2005 et j'ai un form avec 40 PictureBox créés dynamiquement.
J'ai également un tableau de données Tb(i)Ima ou Ima est déclaré comme Image

J'affecte ce tableau de cette manière
Tb(i).Ima = Image.FromFile(FileVignette) ou FileVignette est un chemin valide de fichier JPG
cela fonctionne, mon soucis est que les fichiers ainsi chargés ne sont plus accessibles en modification.

J'ai tenté Tb(i).Ima = Image.FromFile(FileVignette).Clone sans succès

Je suis également passer par une image intermédiaire pour pourvoir la libérée, rien n'y fait
Image = Image.FromFile(FileVignette)
Image.FromFile(FileVignette) = Image
Image.Dispose cette ligne sème la zone dans mon prog

Lorsque j'affecte directement à un PictureBox
PictureBox.Background = Image.FromFile(FileVignette) mon JPG n'est pas verrouillé.
Je me sert de .Background car il est fait partie des Controls du PictureBox ce qui n'est
pas le cas .Image plus difficile à manipuler avec des PictureBox dynamiques (en tout dans
l'état actuel de mes connaissances)

Merci d'avance de vos propositions
 Robin
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
3
Merci
Bonjour

cela fonctionne, mon soucis est que les fichiers ainsi chargés ne sont plus accessibles en modification.


Pas trop compris
Que veux tu modifier ?

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_ShayW
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Dernière intervention
15 juillet 2014
3
Merci
Bonjour,

Cette instruction fait peur
Image.FromFile(FileVignette) = Image


Faite cet essai :
Dim img As Image = Image.FromFile("CheminDeLimage")
img.Dispose()


Le fichier ne devrait pas être verrouillé. En fait le fichier est verrouillé tant qu'il existe une variable de type Image qui pointe vers celui-ci. Il faut bien faire attention a vos variables.

Par exemple, si comme vous le dites vous avez créé un tableau que vous remplissez comme ceci
Tb(i).Ima = Image.FromFile(FileVignette)

Tant que le tableau existe ou plus précisément que Tb(i).Ima existe, le fichier sera verrouillé. Donc il faudra faire un dispose de chaque .Ima pour libérer les fichiers.

Vous dites que
PictureBox.Background = Image.FromFile(FileVignette)

ne verrouille pas votre fichier. Je ne crois pas trop non. Car déjà un objet de type PictureBox n'a pas de propriété Background mais BackgroundImage et que même si vous faites :
Me.PictureBox1.BackgroundImage = Image.FromFile("CheminDeLimage")

Le fichier sera verrouillé jusqu'à l'appel de Dispose sur la Form.

Sinon il y a ceci :
Dim img as Image = Image.FromStream(New IO.FileStream("CheminDeLimage", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.ReadWrite Or IO.FileShare.Delete))


Par contre je n'ai pas fait d'essai pour voir si la variable est toujours OK si l'image est supprimée.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de foliv57
3
Merci
En fait je gère une bibliothèque de photos que j'affiche dans mes PictureBox, mais en réalité je me sert de vignettes pour
une gestion plus rapide. Lorsque je clique sur une vignette je lance soit photoshop, soit Picture Manager pour modifier
mon fichier photo original. Lorsque je quitte l'éditeur je doit sauvegarder l'original et regénérer le fichier vignette
puis le sauvegarder. C'est là que cela coince car le fichier est verrouillé.

Merci
 Robin

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de ROBIN1
3
Merci
Merci à foliv57 pour les explications et les pistes à explorer
effectivement lire Tb(i).Ima Image.FromFile(FileVignette) au lieu de Image.FromFile(FileVignette) Image
effectivement lire .BackgroundImage au liey de .Background

et pourtant j'avais relu ce n'est pas facile de vieillir ......

 Robin

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de ROBIN1
Messages postés
423
Date d'inscription
vendredi 17 novembre 2006
Dernière intervention
15 juillet 2014
3
Merci
Pas de souci.
Moi quand je poste trop vite et que je vois les fautes d'orthographe que je laisse trainer, j'ai honte.

Pour votre cas, je pense que ma dernière ligne de code devrait marcher. Il faudra juste penser à recharger l'image après modification par paintshop.

D'ailleur je ne l'ai pas trop expliqué désolé. Le point important est le dernier paramètre du new FileStream. Ce paramètre permet de définir comment le flux créé vers le fichier autorise ou non les autres programmes à accéder au fichier. Dans mon exemple j'ai mis ReadWrite or Delete. Ce qui ve dire qu'on autorise les autres programmes à lire, modifier ou supprimer le fichier. Dans votre cas, le Delete ne sera peut être pas nécessaire.

Bonne prog

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de foliv57
0
Merci
Je n'ai pas mieux réussi avec Image.FromStream qu'avec Image.FromFile

J'ai mis en oeuvre ceci qui, à défaut d'être très académique, fonctionne
suivant mon besoin

Dim ImageSource As Image = Image.FromFile(FileSource)
Dim wW, wH As Integer
If ImageSource.Width > ImageSource.Height Then
wW = 600
wH = CInt(wW * ImageSource.Height / ImageSource.Width)
Else
wH = 600
wW = CInt(wH * ImageSource.Width / ImageSource.Height)
End If

If IO.File.Exists(FileVignette ) = True Then
IO.File.Delete(FileVignette ).NIma)
End If

Dim Conversion As New Bitmap(ImageSource, wW, wH)
Conversion.Save(FileVignette, Imaging.ImageFormat.Jpeg)
TbIma(ix).Ima = Conversion
ImageSource.Dispose()

je me sert ensuite de TbIma(ix).Ima pour renseigner mes différent PictureBox.
et mes JPG Source ou Vignette ne sont pas verrouillés
Merci de votre aide bonnes fêtes à tous

 Robin
Commenter la réponse de ROBIN1

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.