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

 

  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : mars 2018
    Messages : 7
    Points : 3
    Points
    3

    Par défaut BitBlt est lent , une idée.

    Bonjour,
    Je viens de VB6 et bosse sur VB.net depuis hier.
    J'ai besoins de copie une fenetre windows pour ensuite récuperer des infos dessus.
    J'ai fait le programme vb6, et en voyant le temps que ca prenait j'ai recommencé sur vb.net et exactement le même temps.
    Ce que je ne m'explique pas c'est que si on copie un rectangle de l'écran vers une picturebox , et bien le temps est le même quelque soit la taille du rectangle ..
    J'ai remarqué que si les couleurs de l'écran sont en 16bits.. c'est nettement plus rapide mais en 32bits.. c'est quand même lent. Et sur WIndows 10 impossible de passer les couleurs en 16bits, on ne peut plus..
    Si vous avez une idée je suis preneur , car je suis perdu :: :-)

    Voici le programme:
    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
    37
    38
    39
    40
    41
    Public Class Form1
        Private Declare Function GetDesktopWindow Lib "user32" () As Long
        Declare Auto Function BitBlt Lib "GDI32.DLL" (ByVal hdcDest 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 Int32) As Boolean
        Dim image
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim xdeb, xfin, ydeb, yfin As Integer
            Dim g1 As Graphics = Graphics.FromHwnd(GetDesktopWindow)
            Dim k As Integer
            xdeb = 0
            ydeb = 0
            xfin = 100
            yfin = 100
            image = New Bitmap(xfin - xdeb + 1, yfin - ydeb + 1, g1)
            Dim g2 As Graphics = Graphics.FromImage(image)
            Dim dc1 As IntPtr = g1.GetHdc
            Dim dc2 As IntPtr = g2.GetHdc
     
     
            ' Parametres
            Dim Stopwatch As System.Diagnostics.Stopwatch
            Stopwatch = New Stopwatch
     
            ' Initialisation : debut de la mesure
     
     
            Stopwatch.Start()
            For k = 0 To 100
                BitBlt(dc2, 0, 0, xfin - xdeb + 1, yfin - ydeb + 1, dc1, xdeb, ydeb, 13369376)
            Next k
     
            Stopwatch.Stop()
            ' Affichage de la mesure
            MessageBox.Show(Stopwatch.Elapsed().TotalSeconds & " secondes")
     
            PictureBox1.Image = image
            g1.ReleaseHdc(dc1)
            g2.ReleaseHdc(dc2)
     
     
        End Sub
    End Class

  2. #2
    Expert éminent

    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2012
    Messages
    4 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Canada

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

    Informations forums :
    Inscription : janvier 2012
    Messages : 4 324
    Points : 8 995
    Points
    8 995
    Billets dans le blog
    23

    Par défaut

    Bonjour,

    À partir de cette page:
    https://www.codeproject.com/search.a...%3b3%3b13%3b14

    Je suis tombé sir celle-ci

    https://www.codeproject.com/Articles...Screen-Capture

    Pour peu que je puisse voir, il ne passe pas par l'API Windows et il le fait par le Framework. Mais comme je ne l'ai jamais essayé, je ne sais pas si c'est mieux que l'API. Il faut être membre pour télécharger l'exemple, mais je n'ai jamais eu de problèmes avec eux. Ils me semblent honnêtes.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    mars 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : mars 2011
    Messages : 74
    Points : 92
    Points
    92

    Par défaut

    'nuit

    Les captures d'écran ne se font pas n'importe quand et tu ne peux en avoir au mieux (d'après les nombreux tests que j'ai fait) que 30 par seconde.
    Si tu fais 100 captures successives de petits morceaux d'écran (même tout petit), cela devrait durer 100/30 = plus de 3 s

    Peut importe la taille de la capture, elle ne peut être faite qu'a un moment précis de l'affichage de l'image.

    Donc, pour analyser divers partie de l'écran, capturer tout l'écran puis analyser les divers parties sur le bitmap capturé.

    Je pense que CopyFromScreen est l'implémentation de bitblt avec la gestion en interne des ReleaseHdc.
    Elle n'est ni plus, ni moins rapide.

  4. #4
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : mars 2018
    Messages : 7
    Points : 3
    Points
    3

    Par défaut

    Bonjour , merci pour vos réponses , j'ai déjà testé CopyFromScreen et c'est même plutôt plus long.
    Merci pour l'info. Effectivement: 60hz .. donne 1/60 testé 100x .. donne 1,66 s c'est exactement ce que j'obtient ..
    Etrangement, sur un pc portable en 16bits , la même procédure va beaucoup, beaucoup plus vite !! Comme l'expliquer .... je ne vois pas ..
    C'est une condition assez étrange .. on va piocher dans la memoire écran sans la modifier. Aucun lien avec la fréquence d'affichage ..
    J'avoue ne pas comprendre ..
    mais pas grave ...
    Par contre ce qui est génant c'est que finalement le programme doit attendre pour rien.
    Il faudrait synchronier la demande avec la fréquence de l'écran .. dur dur ..

  5. #5
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : mars 2018
    Messages : 7
    Points : 3
    Points
    3

    Par défaut

    Y a t il moyen de savoir à quel moment il est possible de récuperer un screen de l'écran .. ?
    Il y a une syncro verticale, y a t il un parametre pour savoir quand l'affichage de l'écran est terminé ?

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    mars 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : mars 2011
    Messages : 74
    Points : 92
    Points
    92

    Par défaut

    C'est marrant, j'ai posé la même question il y a plus d'un an, sans réponses malheureusement.
    https://www.developpez.net/forums/d1...o/#post8885438

    Je ne sais pas ce que tu veux faire exactement mais je ne comprend pas pourquoi tu dis que le programme doit attendre pour rien.
    Si ton PC affiche 25 i/s, tu as 40ms pour faire plein de choses.

    Ce qu'on ne connait pas c'est le moment exact où la capture est faite: ce peut être moins d'une milliseconde après appel de la routine ou 39,99 ms plus tard ...

    Tout dépend de ton traitement et de la fréquence à laquelle il doit être fait.

    Dans mon programme j'ai fait l'acquisition dans un thread (qui ne fait que ça: capture et dépose dans un bitmap) puis le traitement dans quatre autres threads en // car il dure jusqu’à 120 ms pour chaque image.
    Il n'y a pas d'attente, mais seulement un petit décalage .

  7. #7
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : mars 2018
    Messages : 7
    Points : 3
    Points
    3

    Par défaut

    Oui tu as raison.. Je vais faire la partie analyse de l'image et voir ce que ca donne.
    Merci , je m'y mets ...

  8. #8
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : mars 2018
    Messages : 7
    Points : 3
    Points
    3

    Par défaut

    Du coup j'avance dans mon programme .
    Je fais une copie d'écran dans un bitmap ..
    Mais quand j'utilise getpixel dessus, la couleur est à 0 !!
    Je ne comprends pas ..
    Si j'affiche le bitmap dans un picturebox, je vois bien mon écran

    En plus si je fais du setpixel sur ce bitmap , ca ne fait rien ..
    Alors que si je fais le setpixel sur un bitmap vide , ca marche ..
    Il y a un truc particulier à savoir sur un bitmap issue de l'écran ??
    une idée ?

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    mars 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : mars 2011
    Messages : 74
    Points : 92
    Points
    92

    Par défaut

    Rien de spécial.
    Je viens de tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            Dim gfx As Graphics = Graphics.FromImage(bmp)
            gfx.CopyFromScreen(New Point(0, 0), New Point(0, 0), bmp.Size, CopyPixelOperation.SourceCopy)
            Dim v As Integer = bmp.GetPixel(10, 10).ToArgb
            TB_result.AppendText("Couleur pixel: " & Hex(v) & vbCrLf)
    J'obtiens bien la couleur du pixel en 10x10 sous forme hexa

    ou encore avec bitblt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            Dim gfx As Graphics = Graphics.FromImage(bmp)
            Dim hdc1 As IntPtr = gfx.GetHdc
            Dim hdc2 As IntPtr = GetDC(0)
            BitBlt(hdc1, 0, 0, bmp.Width, bmp.Height, hdc2, 0, 0, 13369376)
            gfx.ReleaseHdc(hdc1)
            ReleaseDC(0, hdc2)
            Dim v As Integer = bmp.GetPixel(10, 10).ToArgb
            TB_result.AppendText("Couleur pixel: " & Hex(v) & vbCrLf)

  10. #10
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    mars 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : mars 2018
    Messages : 7
    Points : 3
    Points
    3

    Par défaut

    Super , Merci grâce à ton exemple , j'ai réussi à le faire.
    Je ne comprends pas tout mais , je vais maintenant essayer de comprendre le pourquoi de certaines fonctions.
    Je suis sur le forum depuis 2 jours et l'aide est vraiment très appréciable .
    Merci encore à ceux qui m'ont aidés ..
    Bonne journée

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/02/2011, 17h10
  2. Etude ds un pays anglophone est ce une bonne idée?
    Par solaar dans le forum Etudes
    Réponses: 4
    Dernier message: 17/03/2009, 19h59
  3. Réponses: 2
    Dernier message: 27/01/2009, 22h45
  4. [Python] Est-ce une bonne idée d'utiliser des modules pour stocker des objets ?
    Par Neolander dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 05/04/2008, 14h45
  5. Est ce une bonne idée utiliser Java?
    Par solaar dans le forum Langage
    Réponses: 8
    Dernier message: 22/03/2008, 16h28

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