Reconnaissance de caractère: comment ne charger qu'une partie de l'ecran?

Résolu
Signaler
Messages postés
30
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
10 septembre 2011
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
bonjour,
j'ai déjà posté plusieurs sujet sur ce forum pour m'aider dans mon projet, et votre aide a été efficace et je vous en remercie encore. Mon programme de reconnaissance de caractère marche, le problème, c'est qu'il est trop lent, car, comme on me l'avait déjà fait remarquer, il sur-sollicite la carte graphique.
C'est de la reconnaissance de caractère sur un site internet, donc pour avoir le dc de l'ecran, j'utilise GetDC(0). Comme je l'ai dit, cela fonctionne, mais c'est trop lent.

J'ai cru comprendre qu'il y avait un moyen de ne charger que la partie de l'ecran dont j'avais besoin, ce qui réglerait peut etre le problème de la lenteur. Mais je n'ai pas trouvé comment faire pour ne charger qu'une seule partie. S'agit-il de la meme API mais avec d'autres paramètres? ou d'une API différente?

7 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
Bonjour,
Je te propose le petit test suivant (clair)
Sur un Form : une picturebox picture et un bouton de commande command1
ce code :
Private Type BITMAPINFOHEADER '40 bytes
        biSize As Long
        biWidth As Long
        biHeight As Long
        biPlanes As Integer
        biBitCount As Integer
        biCompression As Long
        biSizeImage As Long
        biXPelsPerMeter As Long
        biYPelsPerMeter As Long
        biClrUsed As Long
        biClrImportant As Long
End Type
Private Type BITMAPINFO
        bmiHeader As BITMAPINFOHEADER
End Type
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateDIBSection Lib "gdi32" (ByVal hdc As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, ByVal lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function SetDIBitsToDevice Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal Scan As Long, ByVal NumScans As Long, Bits As Any, BitsInfo As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Dim iBitmap As Long, iDC As Long

Private Sub Command1_Click()
    Me.Hide
    Picture1.AutoRedraw = True
    Dim bi24BitInfo As BITMAPINFO, bBytes() As Byte, Cnt As Long
    With bi24BitInfo.bmiHeader
        .biBitCount = 24
        .biCompression = BI_RGB
        .biPlanes = 1
        .biSize = Len(bi24BitInfo.bmiHeader)
        .biWidth = 2000 '<<<<====== c'est ici que tu définis la largeur à garder
        .biHeight = 2000 '<<<<====== c'est ici que tu définis la hauteur à garder
    End With
    ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte
    iDC = CreateCompatibleDC(0)
    iBitmap = CreateDIBSection(iDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&)
    SelectObject iDC, iBitmap
    agauche = 200
    enhaut = 150
    BitBlt iDC, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, GetDC(0), agauche, enhaut, vbSrcCopy
    GetDIBits iDC, iBitmap, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
    SetDIBitsToDevice Picture1.hdc, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS
    DeleteDC iDC
    DeleteObject iBitmap
    Me.Show
End Sub



Tu lances, puis réduis tout ce qui n'est pas ton Form (tu auras ainsi un exemple clair : celui de ton bureau)
Bien !
Clique maintenant sur command1 et vois ce que tu as dans la picturebox (un morceau de ton écran.
Lis ensuite attentivement le code et intéresse-toi plus particuli_èrement à :
.biWidth = 2000 '<<<<====== c'est ici que tu définis la largeur à garder
.biHeight = 2000 '<<<<====== c'est ici que tu définis la hauteur à garder
agauche = 200
enhaut = 150
amuse-toi à les faiure varier, relance, vois, etc...
Tu devrais normalement vite "piger"
Bon Week-end

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
3
Je tien par commencer en disant que c pas trop mon domaine. Je me permet de t'ecrir car a la lecture de ton poste l'algo. suivant m'est venu à lespris.

1)Généré une chaîne de caractère
2)Sauvé la chaine dans un champs invisible
3)Afficher (Selement là) la chaine dans un picture box
4)Laisser l'utilisateur entrer du texte dans un champ
5)L'utlisateur clique sur un bouton
6)Récupérer la valeur entrer par l'utilisateur par un GET
7)Comparais la valeur utilisateur par la valeur que nous avons garder
8)Si les valeurs sont égaux en va plus loin si non en retourne au poin 4

Comme cela tu affiche que une seul foi et tu na plus à solicité ta carte graphique.

Bon c peut être naif comme algo. mais il me semble viable.
Messages postés
30
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
10 septembre 2011

je ne suis pas sûr d'avoir compris ton algorithme en fait. Je ne suis pas l'administrateur du site. Je cherche juste à récupérer des valeurs numériques affichées sur un site internet. Et il me semblait qu'utiliser la reconnaissance graphique de caractère était le moyen le plus simple.
Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
3
Tu dis "Je ne suis pas l'administrateur du site." Soooooooooooooooooooorrrrrrryyyyyyyyyyy!!!!
Je n'avais par compris cela!

Bon, je te laisse. Tout mes excuses
Messages postés
30
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
10 septembre 2011

pas de problème;)
mais quelqu'un aurait-il la réponse à ma question svp?? :D
Messages postés
30
Date d'inscription
lundi 30 mai 2011
Statut
Membre
Dernière intervention
10 septembre 2011

okay merci pour ton aide ucfoutu, mais avec ce systeme, je suis obligé de remettre à chaque fois le focus sur le form1 pour utiliser la fonction getpixel? ou ce n'est pas la peine?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
240
mais avec ce systeme, je suis obligé de remettre à chaque fois le focus sur le form1 pour utiliser la fonction getpixel? ou ce n'est pas la peine?

Il n'est absolument pas nécessaire que le Form soit visible. Je ne l'ai rendue visible dans l'exemple, que pour que tu puisses voir ce que contenait la pictureBox (une partie de l'écran)
La fonction GetPixel doit et peut travailler uniquement sur le contenu de la PictureBox, visible ou non.
Je te précise enfin que tout ce qui se trouve dans l'évènement click de command1 agirait de la même manière , placé dans une routine. Cette dernière (si je me rappelle bien ton autre discussion) doit donc être appelée de temps à autre, à chaque "changement de page", que ce soit par un timer ou par un autre procédé.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne intallée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient