IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[VB.Net] Multiplier les Image.FromFile() pour imprimer différentes pages avec image?


Sujet :

VB.NET

  1. #1
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut [VB.Net] Multiplier les Image.FromFile() pour imprimer différentes pages avec image?
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ' 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)? Merci de bien vouloir éclairer ma lanterne, en espérant avoir posté au bon endroit.

    [EDIT]
    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...!??
    [/EDIT]

  2. #2
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    Je ne comprends pas trop le sens de ta question, mais normalement il n'y a pas de problèmes pour charger consécutivement plusieurs image dans un même objet

  3. #3
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Citation Envoyé par bidou
    Je ne comprends pas trop le sens de ta question, mais normalement il n'y a pas de problèmes pour charger consécutivement plusieurs image dans un même objet
    Pardon si je n'ai pas été claire. Tu veux dire qu'il ne devrait normalement pas y avoir de problème à charger un premier fichier d'image pour imprimer la page 1 et ensuite d'affecter à la variable image un nouveau fichier à charger pour la page 2, etc.? J'espère que là c'est plus clair...

    Merci!

  4. #4
    Membre actif Avatar de toniolol
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2005
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 281
    Points : 296
    Points
    296
    Par défaut
    Bonjour,
    je n'ai pas de réponse précise mais il faut peut-être procéder comme avec les PictureBox.
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim photoStream As FileStream = FileInfo.OpenRead
    pbxImage.Image = Image.FromStream(photoStream)
    photoStream.Close()

  5. #5
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Citation Envoyé par toniolol
    Bonjour,
    je n'ai pas de réponse précise mais il faut peut-être procéder comme avec les PictureBox.
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim photoStream As FileStream = FileInfo.OpenRead
    pbxImage.Image = Image.FromStream(photoStream)
    photoStream.Close()
    pas sûre d'avoir compris, donc il faudrait que je prenne un Stream à la place? Ça semble bon et j'ai trouvé quelques trucs sur le Web, mais la syntaxe pour ce genre de chose m'est (hélas encore) étrangère.

    Ce code VB.NET serait-il bon ou mauvais?
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim mon Image as Image ' l'image qui change pour chaque page à imprimer
    Dim imagePath as String = "c:\image\image.jpg"
    Dim imageStream as new Stream = File.OpenRead(imagePath)
    monImage = Image.FromStream(imageStream)
    ...
    ' le code pour imprimer l'image
    ...
    imageStream.Close() ' avant de passer à la suivante

  6. #6
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Pardon pour le UP...

    J'ai essayé avec le code suivant:

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            Dim imageBidon As Image
            Dim imageBidonStream As System.IO.Stream
            imageBidonStream = System.IO.File.OpenRead("print.gif")
            imageBidon = Image.FromStream(imageBidonStream)
            e.Graphics.DrawImage(imageBidon, Me.margeGauche, Me.margeHaute)
            imageBidonStream.Close()
    Apparemment, ça fonctionne bien pour une seule page. Y a-t-il des contre-indications ou des trucs que j'aurais oubliés?

    Merci à l'avance, car la piste me semble très bonne.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 95
    Points : 92
    Points
    92
    Par défaut
    Pour la premiere methode,
    monImage = system...fromFile(monPath1)
    pictureBox1.image = monImage
    monImage = system...fromFile(monPath2)
    pictureBox1.image = monImage

    Ca fonctionne sans probleme; par contre processExplorer indique que les fichiers restent ouverts en lecture.

  8. #8
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Citation Envoyé par nicoarrf
    Pour la premiere methode,
    monImage = system...fromFile(monPath1)
    pictureBox1.image = monImage
    monImage = system...fromFile(monPath2)
    pictureBox1.image = monImage

    Ca fonctionne sans probleme; par contre processExplorer indique que les fichiers restent ouverts en lecture.
    Merci, tu as confirmé ce que je craignais par ce que t'a mentionné processExplorer, et puisque c'est ce que je cherche justement à éviter je suis en train de voir la piste des streams, en me rappelant qu'un ancien collègue de travail a lui aussi utilisé les streams pour autre chose (sans doute avec raison).

    [EDIT]
    Est-ce qu'en utilisant FromStream les fichiers resteraient ouverts? Puis-je faire un stream.Close() avant de passer à l'image suivante, pour être sûre que la première est bien fermée?
    [EDIT]

  9. #9
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 379
    Points
    5 379
    Par défaut
    J'avoue que je ne comprends pas tout (peut-être parce que je n'ai jamais fait d'impression).
    Que ce passe-t-il en fait ? Tu as la même image dans toutes les pages ou ça plante à la 2e page ?

  10. #10
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Avec le code bidon suivant et ensuite avec des images de plus grande taille:

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim imageBidon As Image
    Dim imageBidonStream As System.IO.Stream
    imageBidonStream = System.IO.File.OpenRead("print.gif")
    imageBidon = Image.FromStream(imageBidonStream)
    e.Graphics.DrawImage(imageBidon, Me.margeGauche, Me.margeHaute)
    imageBidonStream.Close()
    ' avec un imageBidon.Dispose() après la boucle For
    ...je constate que dans mon gestionnaire de tâches Windows la mémoire allouée à l'appli monte lorsque je lance l'impression d'une seule page, mais qu'elle retourne (à quelques octets près) à sa valeur initiale. Ça semble fonctionner.

    Merci!

  11. #11
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    enchaine tes image.FromFile ca marchera sans problème

  12. #12
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Citation Envoyé par fregolo52
    J'avoue que je ne comprends pas tout (peut-être parce que je n'ai jamais fait d'impression).
    Que ce passe-t-il en fait ? Tu as la même image dans toutes les pages ou ça plante à la 2e page ?
    C'est une image différente à chaque page, pour ne pas dire deux images en fait, car il y a l'image principale et un close-up plus petit. Ça fait donc pas mal d'images à ouvrir si l'usager veut imprimer plusieurs fiches.

    À cause de cela, j'ai un souci sur les handles de fichiers à fermer et l'utilisation de la mémoire vive de l'ordinateur. Si je dois imprimer plus de 50 pages, est-ce que les 100+ images JPEG ou PNG (faisant plusieurs Ko chacune une fois décompressées pour l'impression) vont demeurer ouvertes et occuper de la mémoire? Et le cas échéant, le garbage collector -- lorsqu'il finira par passer -- va-t-il mettre trop de millisecondes pour enlever tout ça au point où ça gênerait mes clients? (par exemple, souris ne répond pas pendant plus de 5 secondes)

    Sans parler de mon désir d'éviter que mon appli ne devienne gourmande pour rien en mémoire. Et pour finir, l'impression en VB.NET est un domaine que je connais encore plus ou moins.

  13. #13
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Citation Envoyé par bidou
    enchaine tes image.FromFile ca marchera sans problème
    bidou, tu peux rire de moi si tu veux, mais je n'ai pas saisi le sens de «enchaîner les image.FromFile»

  14. #14
    Expert éminent
    Avatar de bidou
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2002
    Messages
    3 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 055
    Points : 7 962
    Points
    7 962
    Par défaut
    un exemple tout bête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Public Class Form1
        Dim cmpt As Long = 1
        Dim MonImage As Image
        Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
     
            MonImage = Image.FromFile("D:\svg\JMARC\graphics\DSC0" + (1576 + cmpt).ToString + ".jpg")
            e.Graphics.DrawImage(MonImage, New PointF((e.MarginBounds.Width - MonImage.Width) / 2, (e.MarginBounds.Height - MonImage.Height) / 2))
            cmpt += 1
            If cmpt < 5 Then e.HasMorePages = True Else e.HasMorePages = False
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.PrintDocument1.Print()
        End Sub
    End Class

  15. #15
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Merci à tous, je devrais être en mesure de me débrouiller avec ce que vous m'avez suggéré.

    [EDIT]
    @bidou:

    pour ton code, je viens d'y découvrir qu'au fond je n'ai absolument pas besoin d'une boucle For, que ça se fait tout seul en fait, nehehehe...!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/04/2008, 16h49
  2. imprimer une facture avec image et texte
    Par mouss4rs dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 23/04/2008, 08h25
  3. Bouton avec image - Problème pour la taille
    Par Sangdrax1604 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 18/10/2006, 14h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo