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 :

Sauver une image en jpeg avec un control (bouton) dessus


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut Sauver une image en jpeg avec un control (bouton) dessus
    Bonsoir,

    J'essaye de sauver une image (situe dans une picturebox) avec un control dessus (un simple bouton par exemple).
    Mais, cela parait assez complique. Et je ne suis pas sur de tout comprendre...
    En fait, j'ai essaye de sauver en fichier jpeg le control picturebox (avec ce qui est dessus: image et bouton), un genre de 'screenshot'.

    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
    16
     
    Imports System.Drawing
     
    Public Class Form1
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            ControlBmpToFile(PictureBox1, "C:\Users\JLuc01\Desktop\")
        End Sub
     
        Public Sub ControlBmpToFile(ByVal control As Control, ByVal file As String)
            Dim bmp As New Bitmap(control.Width, control.Height)
            control.DrawToBitmap(bmp, control.DisplayRectangle)
            bmp.Save(file, System.Drawing.Imaging.ImageFormat.Jpeg)
        End Sub
     
    End Class
    Mais, j'ai une erreur, pas tres clair pour moi: "A generic error occurred in GDI+."
    Bref, je ne sais pas trop comment m'y prendre, si toutefois cela est faisable.

    Toute suggestion est bienvenue.
    Merci,
    JLuc01

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    BONJOUR

    Bitmap.SaveAdd(path&filename,System.Drawing.Imaging.ImageFormat.Jpeg)

    code .vb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    Public Class Form1
        Private pathfilename As String = "C:\Users\JLuc01\Desktop\MonImage"  'chemin +nom de fichier
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim bmp As Bitmap = PictureBox1.Image
            bmp.Save(pathfilename, System.Drawing.Imaging.ImageFormat.Jpeg)
     
        End Sub
    End Class
    bon code....

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    re
    OUPS !!!
    lire :

    Bitmap.Save(path&filename,System.Drawing.Imaging.ImageFormat.Jpeg)

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Bonsoir,

    Avec cette méthode, tu vas obtenir le contenu de ta picturebox (donc l'image), mais j'ai bien peur que tu n'auras pas le contrôle qui est dessus, à moins que ta picturebox ne soit le contrôle parent des contrôles qui sont dessus (à tester).

    Pour remédier à cela, tu peux peut être essayer d'utiliser la méthode DrawToBitmap sur ta form elle-même et de ne retenir que le rectangle correspondant à ta pictureBox. Et si ça ne marche pas, je pense qu'il te restera alors à le faire en plusieurs étape :
    • Un DrawToBitmap pour ta picturebox ;
    • Un DrawToBitmap pour le contrôle qui est dessus.


    Ensuite, concernant l'erreur en elle-même, je ne sais pas trop. Mais il faudrait que tu testes en spécifiant un nom de fichier, et non un nom de répertoire. Je ne dis pas que c'est ce qui cause l'erreur, mais en tout cas, c'en est une !
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    re


    J'essaye de sauver une image (situe dans une picturebox) avec un control dessus (un simple bouton par exemple).
    Mmm...j'ai pas lu cela ...Y COMPRIS LE BOUTON !!!
    Tu veux faire un "snapshot" (instantané photo) du PictureBox ...
    Dans ce cas il faut utiliser :
    -Graphics.CopyFromScreen(upperLeftSource , upperLeftDestination ,RegionSize)
    -le Graphics est crée à partir d'un nouveau Bitmap de taille approprie (la zone ciblé par tes soins, soit la zone cliente )
    -ensuite c'est le code déjà donné...

    code behind vb.net revu avec 2 PictureBoxes:
    -Pic qui affiche l'image du koala + whatever you want (1 ou plusieurs controls droppes edans)
    -PicApercu qui affiche le bitmap "snapshot"

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Public Class Form1
        Private pathfilename As String = "C:\Users\JLuc01\Desktop\MonImage"  'chemin +nom de fichier
           Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Pic.SizeMode = PictureBoxSizeMode.StretchImage
            Pic.Image = My.Resources.Koala
     
            PicApercu.SizeMode = PictureBoxSizeMode.StretchImage
     
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim bmp As Bitmap = CopyPixels1()
            If bmp IsNot Nothing Then
                Dim resukt As DialogResult = MessageBox.Show("Save image", "SnapShot", MessageBoxButtons.OKCancel)
                If resukt = DialogResult.OK Then
                    bmp.Save(pathfilename, System.Drawing.Imaging.ImageFormat.Jpeg)
                End If
            End If
        End Sub
     
     
        Private Function CopyPixels1() As Bitmap
            Dim pointSrc As Point = PointToScreen(Pic.Location)
            Dim pointDest As Point = New Point(0, 0)
            Dim bmp As New Bitmap(Pic.ClientSize.Width, Pic.ClientSize.Height)
            Using gr As Graphics = Graphics.FromImage(bmp)
                gr.CopyFromScreen(pointSrc,
               pointDest, bmp.Size)
            End Using
            PicApercu.Image = bmp
     
     
            Return bmp
        End Function
     
    End Class
    bon code...

  6. #6
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Bonsoir,

    Merci a tous les deux, vous avez pointer exactement sur l'erreur.
    Pas tres malin de ma part d'avoir oublier le nom du fichier. Je ne devais pas avoir les yeux en face des trous a cette heure tardive.
    J'ai aussi remarque les reponses entre 00:51 et 03:21, euh? Vous ne dormez jamais?

    Merci particulierement a Mabrouki pour ce bout de code qui marche parfaitement (sans le PicApercu). Je vais pouvoir me baser la dessus pour continuer.

    A+
    JLuc01

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par JLuc01 Voir le message
    J'ai aussi remarque les reponses entre 00:51 et 03:21, euh? Vous ne dormez jamais?
    Pour ma part, c'était une insomnie ^^

    Sinon, juste un aspect à prendre en compte dans le code fourni par MABROUKI. CopyFromScreen copie une partie de l'écran. C'est à dire que si la fenêtre est en arrière plan ou à moitié masqué, alors le résultat ne sera pas celui escompté.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  8. #8
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    Tres juste a propos de CopyFromScreen.
    Surtout que je voudrais copier cette (image + controle) a partir d'un bouton sur une autre Form, et sans perdre trop en terme de resolution (ce point la est surement plus complique).

    Mais, cela ne fait rien, je vais creuser sur le sujet, c'est un bon point de depart pour moi.
    Et je reviendrais probablement pour plus de questions.

    A+
    JLuc01

  9. #9
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    dorinf
    C'est à dire que si la fenêtre est en arrière plan ou à moitié masqué, alors le résultat ne sera pas celui escompté.
    Euh non ...Quand on clique sur le bouton ou tout autre control du Form il est active et passe au premier plan...

  10. #10
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par MABROUKI Voir le message
    Euh non ...Quand on clique sur le bouton ou tout autre control du Form il est active et passe au premier plan...
    Tu fais l'hypothèse, forte, que cette action sera déclenchée par un événement utilisateur, sur la même form qui plus est (et grâce aux précisions de JLuc01 on sait que ce n'est pas le cas).

    Et il existe des situations où cela ne marcherait tout simplement pas :
    • depuis une tâche en arrière plan (la form peut être masquée, minimisée, etc...) ;
    • si une fenêtre est toujours au dessus (une winform TopMost par exemple, ou deux winform liées entres elle où la seconde est affichée de manière non modale) ;


    De plus, CopyFromScreen peut avoir des comportements bizarre liés à la gestion de la transparence.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  11. #11
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    dorinf
    De plus, CopyFromScreen peut avoir des comportements bizarre liés à la gestion de la transparence.
    En dehors du fait que c'est le seul moyen de capture écran qui existe dans l'API .Net (à l'inverse du old GDI), je ne suis pas censé faire des hypothèses "generales" sur ce qu'il compte faire de CoyFromScreen...

  12. #12
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Mais il ne veut pas faire une copie d'écran. Il veut faire une copie d'un contrôle. Là est toute la différence. Faire une copie d'écran est un moyen parmi plusieurs d'y arriver. Et dans le contexte qu'il a précisé ("Surtout que je voudrais copier cette (image + controle) a partir d'un bouton sur une autre Form"), la solution que tu as proposée via l'utilisation de CopyFromScreen a peu de chance de convenir.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    non ce n'est pas le seul solution!

    Place ton image + ton contrôle dans un Panel!
    Code Exemple à adapter : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Try
                If Panel1.AutoScroll = False Then
                    bmp = New Bitmap(Me.Panel1.Width, Me.Panel1.Height)
                Else
                    bmp = New Bitmap(Me.Panel1.Width - 16, Me.Panel1.Height - 16)
                End If
     
                Me.Panel1.DrawToBitmap(bmp, New Rectangle(0, 0, Me.Panel1.Width, Me.Panel1.Height))
                Me.PictureBox1.Image.Dispose()
                bmp.Save(Images(I2), System.Drawing.Imaging.ImageFormat.Jpeg)
                Me.PictureBox1.Image.Dispose()
                Me.PictureBox1.Image = New System.Drawing.Bitmap(Images(I2))
     
                Me.PictureBox1.Refresh()
                Panel1.AutoScroll = False
            Catch ex As Exception
     
            End Try
    ce code est extrait d'un outils de contrôle d charges, les documents sont photographiés avec un téléphone portable, et retravaillés dans le cadre de la dématérialisation!

    le panel servant de masque pour cacher ce qui n'est pas utiles.l'image est zoomé et une rotation est parfois utile pour recadrer la photo d'ou la gestion du Panel1.AutoScroll pour ne pas afficher les scroll barres dans l'image ainsi sauvegardée!
    Dernière modification par Invité ; 21/09/2016 à 10h48.

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

Discussions similaires

  1. sauver une image avec tkFileDialog.asksaveasfilename
    Par pierre-y dans le forum Général Python
    Réponses: 2
    Dernier message: 19/12/2012, 20h58
  2. Compresser une image en Jpeg avec Taux
    Par lolo81 dans le forum C#
    Réponses: 2
    Dernier message: 24/12/2010, 21h02
  3. Sauvegarder une image (.GIF/.JPG) avec CppWebBrowser
    Par Argol_Medusa dans le forum C++Builder
    Réponses: 12
    Dernier message: 12/12/2005, 11h27
  4. sauver une image en png
    Par greg778 dans le forum Langage
    Réponses: 7
    Dernier message: 13/11/2005, 17h22
  5. Réponses: 2
    Dernier message: 04/08/2005, 11h32

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