none
Comment lire un pixel sur sa form ? RRS feed

  • Question

  • Bonjour,

    Comment lire un pixel sur sa form je vous prie, car j'ai fait ce qui suit mais c'est loin de fonctionner, si vous pouvez m'écrire ce qu'il faut changer, merci ?

    Dim xx as long
    Dim yy as long
    '
    Sub Form2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
      Dim pixel As New Bitmap(Me)
      Dim pixelColor As Color = pixel.GetPixel(xx, yy)
    End Sub
    

    C'est la variable "pixel As" qu'il ne veut pas digérer ?

    Dim pixel As New Bitmap(Me)
    
    

    Cordialement.

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mardi 17 août 2010 10:59

Réponses

  • Bonjour,

    Voici un autre moyen sans utiliser une image :

    Private Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Int32, ByVal x As Int32, ByVal y As Int32) As Int32
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
      Dim pixelColor As Color
    
      Using g As Graphics = Graphics.FromHwnd(Me.Handle)
        pixelColor = ColorTranslator.FromWin32(GetPixel(g.GetHdc(), x, y))
      End Using
    
    End Sub
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 17 août 2010 14:01
    Modérateur
  • Dans le code que tu envoies tu as remplacé la taille du bitmap et la position du pixel que j'avais précisé par les coordonnées du curseur de la souris . C'est pour cela que tu obtiens une erreur.

    Il faut laisser Bitmap(1,1) car il s'agit simplement de préciser une taille pour une image temporaire : autant que cette image soit la plus petite possible.

    Le GetPixel(0,0) permet d'obtenir le premier de cette image pixel et donc celui sous le cursuer de la souris.

    Les coordonnées de la souris ne sont utilisées que dans la méthode CopyFromScreen (e.Location )

    Donc en fait reprend le code comme indiqué et cela devrait fonctionner :)

    Pour les couleurs ARBG, tu peux utiliser les propriétés de la classe couleur comme ce que tu as commencé à écrire.

    Using bmp As New Bitmap(1, 1)
     Using g As Graphics = Graphics.FromImage(bmp)
      g.CopyFromScreen(CType(sender, Control).PointToScreen(e.Location), Point.Empty, bmp.Size)
      Dim color As Color = bmp.GetPixel(0, 0)
      MessageBox.Show(String.Format("Couleur A:{0},R:{1},G:{2},B:{3}", color.A, color.R, color.G, color.B))
     End Using
    End Using
    
    

     

     

    • Marqué comme réponse EhJoe mercredi 18 août 2010 17:45
    mercredi 18 août 2010 12:45
    Modérateur

Toutes les réponses

  • Bonjour,

    il est possible de copier l'affichage à l'écran via la méthode CopyFromScreen. Pour récupérer la couleur d'un pixel, on peut copier qu'une toute petite partie de l'image (  1x1 pixel ) . A pertir de l'image obtenue on récupère le pixel 0,0 pour obtenir la couleur.

    Voici un exemple fonctionnant sur l'event click d'une form.

    Private Sub Form1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick
      Using bmp As New Bitmap(1, 1)
        Using g As Graphics = Graphics.FromImage(bmp)
          g.CopyFromScreen(CType(sender, Control).PointToScreen(e.Location), Point.Empty, bmp.Size)
          MessageBox.Show(bmp.GetPixel(0, 0).ToString())
        End Using
      End Using
    End Sub
    
    
    Cordialement

    mardi 17 août 2010 12:57
    Modérateur
  • Bonjour,

    Voici un autre moyen sans utiliser une image :

    Private Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Int32, ByVal x As Int32, ByVal y As Int32) As Int32
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
      Dim pixelColor As Color
    
      Using g As Graphics = Graphics.FromHwnd(Me.Handle)
        pixelColor = ColorTranslator.FromWin32(GetPixel(g.GetHdc(), x, y))
      End Using
    
    End Sub
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mardi 17 août 2010 14:01
    Modérateur
  • Nikho,

    Le code de la couleur ne passe pas, voici :

     Sub Form2_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick
      If e.Button <> Windows.Forms.MouseButtons.Left Then Exit Sub ' pipette
      If copie = False Or okZone = False Then Exit Sub
      Using bmp As New Bitmap(e.X, e.Y)
       Using g As Graphics = Graphics.FromImage(bmp)
        g.CopyFromScreen(CType(sender, Control).PointToScreen(e.Location), Point.Empty, bmp.Size)
        MessageBox.Show(bmp.GetPixel(e.X, e.Y).ToString())
        'HScrollBar4.Value = pixelColor.A
        'HScrollBar1.Value = pixelColor.r
        'HScrollBar2.Value = pixelColor.G
        'HScrollBar3.Value = pixelColor.B
        'Call melange()
       End Using
      End Using
     End Sub
    
    

    Il plante ici :

    MessageBox.Show(bmp.GetPixel(e.X, e.Y).ToString())
    
    

    Avec un message qui dit :

    Le paramètre doit être positif et inférieur à la largeur. Nom du paramètre : x

    ???

    Il faut aussi que je puisse récupérer les couleurs (A, RGB), voir le reste de mon code en dessous de l'erreur ?

    Cordialement.

     

     


    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mercredi 18 août 2010 12:27
  • Dans le code que tu envoies tu as remplacé la taille du bitmap et la position du pixel que j'avais précisé par les coordonnées du curseur de la souris . C'est pour cela que tu obtiens une erreur.

    Il faut laisser Bitmap(1,1) car il s'agit simplement de préciser une taille pour une image temporaire : autant que cette image soit la plus petite possible.

    Le GetPixel(0,0) permet d'obtenir le premier de cette image pixel et donc celui sous le cursuer de la souris.

    Les coordonnées de la souris ne sont utilisées que dans la méthode CopyFromScreen (e.Location )

    Donc en fait reprend le code comme indiqué et cela devrait fonctionner :)

    Pour les couleurs ARBG, tu peux utiliser les propriétés de la classe couleur comme ce que tu as commencé à écrire.

    Using bmp As New Bitmap(1, 1)
     Using g As Graphics = Graphics.FromImage(bmp)
      g.CopyFromScreen(CType(sender, Control).PointToScreen(e.Location), Point.Empty, bmp.Size)
      Dim color As Color = bmp.GetPixel(0, 0)
      MessageBox.Show(String.Format("Couleur A:{0},R:{1},G:{2},B:{3}", color.A, color.R, color.G, color.B))
     End Using
    End Using
    
    

     

     

    • Marqué comme réponse EhJoe mercredi 18 août 2010 17:45
    mercredi 18 août 2010 12:45
    Modérateur