OVH Cloud OVH Cloud

Image.FromFile(string) dans une boucle For

3 réponses
Avatar
Anne DeBlois
Bonjour,

Je suis en train de peaufiner une classe dérivée de PrintDocument, dont le
but est d'imprimer les fiches d'informations de plantes avec images. Dans la
méthode OnPrintPage j'ai pensé lire une table temporaire qui contient les
enregistrements sélectionnés pour l'impression, et pour imprimer chaque page
une à la fois, je compte utiliser une boucle For.

Pour charger l'image pour chaque fiche, je lirai le chemin d'accès (relatif
ou absolu, c'est à déterminer) dans la ligne

' Dans la boucle For
...
magePlante = System.Drawing.Image.FromFile(path)
...
...

Mais je me suis rendu compte qu'une image chargée à partir d'un fichier ne
se décharge qu'en appelant le .Dispose(). Cela veut-il dire que je ne
pourrai pas appeler la ligne ci-dessus pour charger l'image suivante?
Dois-je procéder autrement (par exemple avec une imagelist ou autre)?

En fait, je me demande s'il y a des dangers à laisser des fichiers d'images
ouverts (et par conséquent verrouillés??) lorsqu'on charge une première
image en faisant monImage = image.FromFile("fichier1.jpg") et qu'ensuite on
fasse monImage = image.FromFile("fichier2.jpg"). La première image est-elle
fermée automatiquement? Y a-t-il récupération de la mémoire? J'espère que
c'est mieux comme ça...!??

Merci de bien vouloir éclairer ma lanterne, en espérant avoir posté
clairement et au bon endroit.

ANNE DEBLOIS

3 réponses

Avatar
Anne DeBlois
Je suis en train d'explorer la piste FromStream - code bidon à tester:
------------------
Dim imageBidon As Image
Dim imageBidonStream As System.IO.Stream
' Dans la boucle For
...
imageBidonStream = System.IO.File.OpenRead("print.gif")
imageBidon = Image.FromStream(imageBidonStream)
e.Graphics.DrawImage(imageBidon, Me.margeGauche, Me.margeHaute)
imageBidonStream.Close()
' Et ensuite je mets le reste du code dans la boucle For pour revenir avec
' la fiche suivante à imprimer, en donnant le nom de fichier de l'image
suivante
--------------------------

Apparemment ça fonctionne pour une page unique, y aurait-il des
contre-indications pour plus d'une fiche à imprimer? Ai-je oublier des
détails? Merci à l'avance,

ANNE DEBLOIS
Avatar
Anne DeBlois
Problème résolu, avec un imageBidon.Dispose() au sortir de la boucle For.
Avatar
Patrice
Pour ma part, je ne vois pas quel est le problème que tu cherches à
contourner par rapport à la méthode précédente.

A priori tu fais un dispose sur une image pour la libérer mais la ligne que
tu indiques crée de toute façon une toute nouvelle image. Je ne vois en quoi
l'appel du dispose serait gênant (ce qui te gène est que c'est la même
variable ? attention à ne pas confondre la variable qui représente ton objet
et l'objet lui même qui sera un autre object, en gros une variable object
est un pointeur, c'est donc la même variable mais elle "pointera" vers un
objet qui n'a rien à voir avec celui sur lequel tu a appelé "dispose")...

Avais tu essayé ? Si oui, qu'est ce qui ne marchais pas ? Si non, essaye ta
première idée avant de chercher à contourner qun problème qui n'existe
peut-être pas...

--
Patrice

"Anne DeBlois" a écrit dans le message de
news:
Je suis en train d'explorer la piste FromStream - code bidon à tester:
------------------
Dim imageBidon As Image
Dim imageBidonStream As System.IO.Stream
' Dans la boucle For
...
imageBidonStream = System.IO.File.OpenRead("print.gif")
imageBidon = Image.FromStream(imageBidonStream)
e.Graphics.DrawImage(imageBidon, Me.margeGauche, Me.margeHaute)
imageBidonStream.Close()
' Et ensuite je mets le reste du code dans la boucle For pour revenir avec
' la fiche suivante à imprimer, en donnant le nom de fichier de l'image
suivante
--------------------------

Apparemment ça fonctionne pour une page unique, y aurait-il des
contre-indications pour plus d'une fiche à imprimer? Ai-je oublier des
détails? Merci à l'avance,

ANNE DEBLOIS