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

ROBIN1 - 20 déc. 2012 à 19:17 - 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 

6 réponses

Répondre au sujet
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 20 déc. 2012 à 19:25
+3
Utile
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 ?
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_ShayW
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 20 déc. 2012 à 20:53
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de foliv57
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ROBIN1
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ROBIN1
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 20 déc. 2012 à 22:49
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de foliv57
0
Utile
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.