none
VB.NET PictureBox RRS feed

  • Question

  • Bjr,

    Je n'arrive pas à enregistrer une PictureBox (signature d'un client) dans un fichier.

    Voici mon code :

        Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
            Dim NewPoint As New Point(e.X, e.Y)
            Dim NewGraphic As Graphics = PictureBox1.CreateGraphics()
            NewGraphic.DrawLine(pen, PreviousPoint.X, PreviousPoint.Y, NewPoint.X, NewPoint.Y)
            NewGraphic.Dispose()
            PreviousPoint = NewPoint
        End Sub


        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            If Me.PictureBox1.Image IsNot Nothing Then
                Me.PictureBox1.Image.Save("test.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
            Else
                MsgBox("NULL")
            End If

        End Sub

    J'obtiens toujours NULL !!!!

    samedi 27 juillet 2013 15:30

Réponses

  • STOP !!

    C'est une question d'affichage du Pocket. J'ai chargé la signature sur mon PC, elle apparait nickel !

    Je vous remercie très chaleureusement pour votre prestation, Jacques

    Pierre FERRY

    AIS Codes-barres

    • Marqué comme réponse Lascrofff mardi 30 juillet 2013 09:49
    mardi 30 juillet 2013 09:49

Toutes les réponses

  • Bonjour Lascrofff,

    Sans conséquence ici, mais j'ai changé Pen en myPen, Pen étant une classe. Ce qui se passe c'est que tu dessines dans NewGraphic, pas dans PictureBox1 : il faut donc affecter à la propriété Image du PictureBox ce qui  a été dessiné dans NewGraphic, par exemple comme ceci :

        Dim myPen As New System.Drawing.Pen(Brushes.Blue)
        Dim PreviousPoint As Point
    
        Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
            Dim NewPoint As New Point(e.X, e.Y)
            Dim NewGraphic As Graphics = PictureBox1.CreateGraphics()
    
            NewGraphic.DrawLine(myPen, PreviousPoint.X, PreviousPoint.Y, NewPoint.X, NewPoint.Y)
            NewGraphic.Dispose()
            PreviousPoint = NewPoint
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim bmp As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
            Using g As Graphics = Graphics.FromImage(bmp)
                Dim pt As Point = Me.PictureBox1.PointToScreen(New Point(0, 0))
                g.CopyFromScreen(pt.X, pt.Y, 0, 0, bmp.Size)
            End Using
            PictureBox1.Image = bmp
            If PictureBox1.Image IsNot Nothing Then
                Dim fName As String = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) & "\Test.jpg"
                PictureBox1.Image.Save(fName, System.Drawing.Imaging.ImageFormat.Jpeg)
            Else
                MsgBox("NULL")
            End If
    
        End Sub


    Cordialement, Jacques

    samedi 27 juillet 2013 16:52
  • Bonjour Jacques,

    Merci pour ta réponse.

    Malheureusement, le compact framework 3.5 ne reconnait pas CopyFromScreen comme membre de System.Drawing.Graphics, et je n'arrive pas à trouver d'ersatz...

    Aurais-tu un plan B ?

    Merci.


    dimanche 28 juillet 2013 06:21
  • Pour quel périphérique développes tu ? (XBox, Windows Phone, ...) avec quel SDK ?

    C'est un domaine qui m'est un peu étranger ...


    Cordialement, Jacques

    dimanche 28 juillet 2013 08:53
  • Quelle version de Visual Basic utilise tu ? Le compact Framework n'est pas supporté sous VS 2010:

    Le développement d'applications .NET Compact Framework est pris en charge dans Visual Studio 2008, mais pas dans Visual Studio 2010

    extrait du Portail du .NET Compact Framework


    Cordialement, Jacques

    dimanche 28 juillet 2013 09:48
  • Désolé de te faire bosser un dimanche...

    Je développe un progiciel de prise de commande avec signature sur PIDION BIP 5000, sous Windows Mobile 5 (Pocket PC) en VB.NET 2008.

    J'ai développé beaucoup de logiciels sur ce genre de Pocket PC (PSION essentiellement, voir aiscodesbarres.fr), mais c'est la première fois qu'on me demande une signature.

    Je touche presque au but, après avoir consulté pas mal de sites et de forums, mais il me manque juste de quoi 'fixer' le dessin dans la PictureBox. Après, ce sera du gâteau...

    Merci encore...

    dimanche 28 juillet 2013 10:08
  • Avec l'API BitBlt , ça semble jouable. Elle se trouve dans GDI32.dll pour Windows, et dans CoreDll.dll pour le Compact Framework. Elle peut faire, entre autre, ce que fait la méthode CopyFromScreen. Remplaces le code de Button2_Click par :

        Const SRCCOPY As Integer = &HCC0020
        Public Declare Function BitBlt Lib "coredll.dll" _
            (ByVal hdc As IntPtr, ByVal nXDest As Integer, _
                                  ByVal nYDest As Integer, _
                                  ByVal nWidth As Integer, _
                                  ByVal nHeight As Integer, _
                                  ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, _
                                  ByVal nYSrc As Integer, ByVal dwRop As Integer) As Boolean
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim bmp As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
            Using g As Graphics = Graphics.FromImage(bmp)
                With PictureBox1
                    Dim pt As Point = .PointToScreen(New Point(0, 0))
                    ' Blit the image data
                    BitBlt(g.GetHdc(), pt.X, pt.Y, .Width, .Height, .CreateGraphics.GetHdc(), .Left, .Top, SRCCOPY)
                End With
                'g.CopyFromScreen(pt.X, pt.Y, 0, 0, bmp.Size)
            End Using
            PictureBox1.Image = bmp
            If PictureBox1.Image IsNot Nothing Then
                Dim fName As String = Environment.GetFolderPath(Environment.SpecialFolder.Personal) & "\Test.jpg"
                PictureBox1.Image.Save(fName, System.Drawing.Imaging.ImageFormat.Jpeg)
            Else
                MsgBox("NULL")
            End If
    
        End Sub

    Saisie de la signature :

    Et après sauvegarde, dans l'explorateur :

    Quoi ? pas lisible la signature ?

    Voir ce fil : CopyFromScreen under Compact Framework


    Cordialement, Jacques

    dimanche 28 juillet 2013 16:03
  • On approche, on approche !

    Le fichier est tout noir au moment de l'enregistrer.

    Je regarde de mon côté.

    Bonne fin de WE !

    dimanche 28 juillet 2013 16:55
  • Ce code devrait être plus adapté :

        Const SRCCOPY As Integer = &HCC0020
        Public Declare Function BitBlt Lib "GDI32.dll" _
            (ByVal hdcDst As IntPtr, _
             ByVal nXDest As Integer, ByVal nYDest As Integer, _
             ByVal nWidth As Integer, ByVal nHeight As Integer, _
             ByVal hdcSrc As IntPtr, _
             ByVal nXSrc As Integer, ByVal nYSrc As Integer, _
             ByVal dwRop As Integer) As Boolean
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim bmp As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
            Using g As Graphics = Graphics.FromImage(bmp)
                With PictureBox1
                    BitBlt(g.GetHdc(), 0, 0, _
                                       .Width, .Height, _
                                       .CreateGraphics.GetHdc(), _
                                       0, 0, SRCCOPY)
                End With
            End Using
            PictureBox1.Image = bmp
            If PictureBox1.Image IsNot Nothing Then
                Dim fName As String = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) & "\Test.jpg"
                PictureBox1.Image.Save(fName, System.Drawing.Imaging.ImageFormat.Jpeg)
            Else
                MsgBox("NULL")
            End If
        End Sub

    Pour le Compact Framework remplacer "GDI32.dll" par " CoreDll.dll", et adapter le chemin.


    Cordialement, Jacques


    • Modifié Jacques93 mardi 30 juillet 2013 08:12 ImageFormat..Jpeg
    lundi 29 juillet 2013 17:34
  • Je crois qu'il est impossible de sauver un picturebox chargé ainsi

    Il faut que tu passes par un objet BitMap


    FB

    mardi 30 juillet 2013 07:08
  • Bonjour Jacques,

    On touche au but !!

    Quand j'ouvre le BMP, j'ai bien la signature, mais à l'intérieur d'un écran noir.

    Je suppose que ce n'est qu'une question de taille. Je vais faire un essai en diminuant .Width et .Height de '1'.

    Merci.

    mardi 30 juillet 2013 09:28
  • C'est pareil, un grand sarcophage noir.

    J'ai essayé en .bmp, pareil.

    @+

    mardi 30 juillet 2013 09:32
  • J'ai l'impression qu'il considère que la taille du logo est celle de l'écran
    mardi 30 juillet 2013 09:33
  • bp = New Bitmap(pictureBox.Width, pictureBox.Height)
    pictureBox.DrawToBitmap(bp, pictureBox.ClientRectangle)
    bp.Save(path, ImageFormat.Jpeg)

    Et un truc de ce style?

    FB

    mardi 30 juillet 2013 09:39
  • STOP !!

    C'est une question d'affichage du Pocket. J'ai chargé la signature sur mon PC, elle apparait nickel !

    Je vous remercie très chaleureusement pour votre prestation, Jacques

    Pierre FERRY

    AIS Codes-barres

    • Marqué comme réponse Lascrofff mardi 30 juillet 2013 09:49
    mardi 30 juillet 2013 09:49
  • N'ayant pas de Pocket PC, j'ai utilisé l'émulateur pour les tests :

    et c'est OK. J'ai fait ce matin une petite modif au code d'hier 20:00h pour enregistrer le fichier au format .Jpeg. Depuis le relookage des forums on ne voit plus les dates de modification des messages :-(

    Et pour ceux qui voudraient utiliser BitBlt sous VBA ou VB6 : KB147810


    Cordialement, Jacques

    mardi 30 juillet 2013 10:08