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

Windows Forms Discussion :

Sauvegarde image PictureBox avec Image.Save [Débutant]


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut Sauvegarde image PictureBox avec Image.Save
    Bonjour

    j'ai placé dynamiquement sur un pictureBox1 un pictureBox2 à l'aide de DrawImage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim g As Graphics
            Dim src_rect As New Rectangle(0, 0, largeur, hauteur)
            Dim dst_rect As New Rectangle(X, Y, largeur, hauteur)
            g = PictureBox1.CreateGraphics
            g.DrawImage(PictureBox2.image, dst_rect, src_rect, GraphicsUnit.Pixel)
    Lorsque je veux sauvegarder l'image de pictureBox1 à l'aide de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PictureBox1.Image.Save("c:\MonFichier.bmp", Imaging.ImageFormat.Bmp)
    une exception est générée me disant que pictureBox1.image est Null (il n'y a pas d'image) et pourtant à l'écran je vois bien le PictureBox2 dans le PictureBox1.
    Qu'est-ce qui ne convient pas ?
    Merci de votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour,
    c'est, je pense, comme ici.
    A savoir attribuer le dessin à la propriété Image du picturebox concerné.
    Dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            Dim Bmp As Bitmap = New Bitmap(PictureBox1.ClientSize.Height, PictureBox1.ClientSize.Width)
            Using g As Graphics = Graphics.FromImage(Bmp)
                Dim src_rect As New Rectangle(0, 0, largeur, hauteur)
                Dim dst_rect As New Rectangle(X, Y, largeur, hauteur)
                g.DrawImage(PictureBox2.Image, dst_rect, src_rect, GraphicsUnit.Pixel)
                PictureBox1.Image = Bmp
            End Using

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Bonsoir

    hélas, ce que vous me proposez ne convient pas car je rajoute plusieurs PictureBox dynamiques sur PictureBox1, et à chaque fois que je fais New Bitmap cela efface les PictureBox précédents avant d'afficher le nouveau.
    On dirait que les PictureBox ne sont pas dessinés sur PictureBox1 avec ma méthode, mais simplement "posés".
    Comment procéder alors ?
    Merci.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Je me demandais si je n'aurais pas intérêt de placer plutôt mes pictureBox dynamiques dans un Panel pour les déplacer comme je veux, puis ensuite dans un picturebox non visible, redessiner toutes les images de mes pictureBox dynamiques, pour enfin sauvegarder l'image au format bmp de ce pictureBox caché.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Bonjour

    en fait, j'ai mal exposé mon problème.
    J'ai des picturebox dynamiques que j'ajoute (controls.add) sur un PictureBox1, et en même temps je dessine avec DrawImage sur un PictureBox3 l'ensemble de mon pictureBox1 avec ses pictureBox dynamiques.
    C'est le pictureBox3 que je souhaiterais sauvegarder avec image.save, mais l'exception m'indique que pictureBox3 est vide.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour,
    Citation Envoyé par sergelagier Voir le message
    Bonsoir

    hélas, ce que vous me proposez ne convient pas car je rajoute plusieurs PictureBox dynamiques sur PictureBox1, et à chaque fois que je fais New Bitmap cela efface les PictureBox précédents avant d'afficher le nouveau.
    On dirait que les PictureBox ne sont pas dessinés sur PictureBox1 avec ma méthode, mais simplement "posés".
    Comment procéder alors ?
    Merci.
    c'est une histoire de portée de variable
    Déclaré et instantié dans la procédure, le Bitmap est créé à chaque appel de celle ci et ne vit que le temps de celle ci.
    Seul le dernier dessin est conservé.

    Il faut déclarer le Bitmap au niveau de la classe et l'instancier au démarrage du formulaire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Dim Bmp As Bitmap
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Bmp = New Bitmap(PictureBox1.ClientSize.Height, PictureBox1.ClientSize.Width)
     
        End Sub
    On dessine ainsi toujours sur le même Bitmap.

    Exemple, j'ai créé une ImageList qui comprends quelques images de même format 64*64.
    J'ai un Button qui peut m'ajouter quelques images horizontalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Dim i As Integer
        Dim im As Integer = 0
        Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
     
            AjoutImage(Bmp, 64, 64, i, 0, ImageList1.Images(im))
            i += 70
            im += 1
     
        End Sub
    et la procédure d'ajout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Private Sub AjoutImage(bmp As Bitmap, largeur As Integer, hauteur As Integer, X As Integer, Y As Integer, image As Image)
     
            Using g As Graphics = Graphics.FromImage(bmp)
                Dim src_rect As New Rectangle(0, 0, largeur, hauteur)
                Dim dst_rect As New Rectangle(X, Y, largeur, hauteur)
                g.DrawImage(image, dst_rect, src_rect, GraphicsUnit.Pixel)
                PictureBox1.Image = bmp
            End Using
     
        End Sub
    enfin si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PictureBox1.Image.Save(Application.StartupPath & "\MonFichier.png", Imaging.ImageFormat.Png)
    j'ai bien toutes mes images sauvegardées sur le même Bitmap.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Super ! j'ai bien mes pictureBox et je peux enregistrer avec image.save. Merci beaucoup de votre aide.

    Par contre, j'ai un dernier (ce serait étonnant ?!!) petit soucis : l'image bmp sauvegardée à son fond entièrement noir. Pourtant j'ai mis le backColor de ce picturebox à Color.White.
    J'ai donc le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim Bmp As Bitmap
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Bmp = New Bitmap(PictureBox1.ClientSize.Width, PictureBox1.ClientSize.Height)
     
           PictureBox1.BackColor = Color.White
     
            AjoutImage(....
     
            PictureBox1.Image.Save(....
     
        End Sub
    Avez-vous une explication SVP ?

    Deuxième question : pourquoi faut-il mettre ClientSize.Width et pas indiquer directement Width ?

    Cordialement.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    Et quand j'enregistre un Png, le fond est transparent !!

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 39
    Points : 22
    Points
    22
    Par défaut
    C'est bon j'ai trouvé ce qu'il fallait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                bmp = New Bitmap(PictureBox1.ClientSize.Width, PictureBox1.ClientSize.Height)
                Dim g As Graphics = Graphics.FromImage(bmpEtiquette)
                g.Clear(Color.White)
    et j'ai supprimé le BackGround.
    Voilà cela pourra peut-être servir à d'autres qui débutent comme moi.

    Encore merci. Discussion résolue

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    J'utilise, par habitude, le format png car il gère la transparence, mais je ne suis pas spécialiste de ces formats, si un connaisseur passe par là ...
    Pour la seconde question, c'est une habitude aussi,je préfère utiliser la zone cliente que la zone occupée par le contrôle.
    La zone cliente d'un contrôle correspond aux limites du contrôle, moins les éléments non-clients, tels que les barres de défilement, les bordures, les barres de titre et les menus.
    C'est vrai que pour un PictureBox même avec une bordure 3D, il n'y aura peu de zones tronquées sur l'image affichée.

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

Discussions similaires

  1. [RegEx] distinguer le lien avec image et une image dans un répertoire
    Par bigs3232 dans le forum Langage
    Réponses: 2
    Dernier message: 19/12/2010, 11h39
  2. PictureBox avec image volatile au 1er coup
    Par Claude_Azoulai dans le forum VB.NET
    Réponses: 9
    Dernier message: 22/05/2010, 09h37
  3. popup : changer image fille avec image mère
    Par niavlys77 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/06/2009, 15h05
  4. Publipostage avec images, aperçu des images !
    Par marcb03 dans le forum Word
    Réponses: 14
    Dernier message: 20/11/2008, 00h33
  5. problème convertion image jpg en image svg avec batik
    Par linkB2 dans le forum Multimédia
    Réponses: 1
    Dernier message: 27/04/2006, 00h16

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