[Ex] Loupe

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

[Ex] Loupe

#1

Message par Iste »

Salutations,

Voici un petit bout de script qui utilisé avec de trop grandes valeur vous fera ressentir les limite d'autoit ;)

Code : Tout sélectionner

HotKeySet('g','get')

$gui = GUICreate('')
GUISetState()

$zoom = zoom2($gui, 25,25,20,20,MouseGetPos(0)-5,MouseGetPos(1)-5)

While   1
    Sleep(5000)
WEnd

Func get()
    $zoom = zoom2($gui, 25,25,20,20,MouseGetPos(0)-5,MouseGetPos(1)-5, $zoom)   
EndFunc



Func zoom2(ByRef $Z_Gui, $Z_NbX, $Z_NbY, $Z_LX, $Z_LY, $Z_CX, $Z_CY, $Z_Maj = "")
    Local $Z_winpos = WinGetPos($Z_Gui)
    WinMove($Z_Gui,"" ,$Z_winpos[0],$Z_winpos[1] ,$Z_NbX * $Z_LX, $Z_NbY * $Z_LY)
    GUISwitch($Z_Gui)
    
    If $Z_Maj = "" Then
        Dim $Z_Color[$Z_NbX][$Z_NbY]
        Dim $Z_Label[$Z_NbX][$Z_NbY]
        For $Z_i = 0 To $Z_NbX -1
            For $Z_u = 0 To $Z_NbY -1
                $Z_Color[$Z_i][$Z_u] = PixelGetColor($Z_i + $Z_CX, $Z_u + $Z_CY)
                $Z_Label[$Z_i][$Z_u] = GUICtrlCreateLabel('', $Z_i * $Z_LX, $Z_u * $Z_LY, $Z_LX, $Z_LY)
                GUICtrlSetbkColor($Z_Label[$Z_i][$Z_u], $Z_Color[$Z_i][$Z_u])
            Next
        Next
        Return $Z_Label
    Else
        Dim $Z_Color[$Z_NbX][$Z_NbY]
        $Z_Label = $Z_Maj
        For $Z_i = 0 To $Z_NbX -1
            For $Z_u = 0 To $Z_NbY -1
                $Z_Color[$Z_i][$Z_u] = PixelGetColor($Z_i + $Z_CX, $Z_u + $Z_CY)
                ;$Z_Label[$Z_i][$Z_u] = GUICtrlCreateLabel('', $Z_i * $Z_LX, $Z_u * $Z_LY, $Z_LX, $Z_LY)
                GUICtrlSetbkColor($Z_Label[$Z_i][$Z_u], $Z_Color[$Z_i][$Z_u])
            Next
        Next
        Return $Z_Label
    EndIf
EndFunc
La fonction zoom2() prend en parametre :
ByRef $Z_Gui : une GUI qui sera utilisée pour afficher l'image. Elle sera redimensionnée à la bonne taille.
$Z_NbX : Nombre de pixel de largeur scannés
$Z_NbY : Nombre de pixel de hauteur scannés
$Z_LX, $Z_LY : Largeur des pixel dans la GUI. Une valeur de 1 n'altèrera pas l'image. 2 fera un zoom x2, 10 x10...
$Z_CX, $Z_CY : Coordonées de départ de la zone de scanne
$Z_Maj = "" : Placez ici la valeur renvoyé par un premier zoom2() pour mettre a jour une série de label au lieu de les recreer

Voila, ya surement moyen de faire mieux. Les label sont pas tres adaptés, mais bon, ca marche :p

PS : pour tester, commencez avec de petites valeur $Z_NbX et $Z_NbY
Signez ici
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [Ex] Loupe

#2

Message par sylvanie »

Rigolo !

Mais je pense qu' on peut optimiser la "lenteur" apparante qui viens du fait que tu recrées des contrôles à chaque appel. Et du coups perte de temps + saturation mémoire car on n'a pas de maîtrise de la libération d'Autoit.
Ceci est contournable en testant simplement un booléen pour savoir si on a déjà créé les contrôles, et surtout les déclarer en globales pour que ça marche (et oui, je pleurerai toujours l'absence de la notion de "static" dans Autoit ... )

Du coups, à la 2eme execution via la touche "g" c'est plus rapide, et on ne réalloue pas de mémoire supplémentaire
► Afficher le texte
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [Ex] Loupe

#3

Message par Iste »

En faite j'ai simplement mal recopier ma fonction, car normalement cela été prévu ^^''

dans la partie Else, il faut retirer cette ligne

Code : Tout sélectionner

$Z_Label[$Z_i][$Z_u] = GUICtrlCreateLabel('', $Z_i * $Z_LX, $Z_u * $Z_LY, $Z_LX, $Z_LY)
merci de l'avoir remarqué ;)

en effet, la variable $Z_Maj contien justement les label, pour ne pas a avoir les recréer, mais je le fais quand meme...
Signez ici
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [Ex] Loupe

#4

Message par sylvanie »

ah bah oui, je n'avais pas remarqué que tu réutilisais le context en dernier argument dans l'appel ^^'
Donc effectivement un ";" suffisait :lol:
Mais bon ceci servira d'exple aux jeunes dévellopeurs: Réutilisons la mémoire pour augmenter la vitesse (si c'est possible ...)
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [Ex] Loupe

#5

Message par sylvanie »

Allons jusqu'au bout du raisonnement : ajout d'un cache de la couleur des pixel afin de ne repaindre uniquement les labels qui ont changé de couleur.

Faites le test sur des zones où le fond reste à peu près similaire, celà accélère sensiblement l'affichage :
► Afficher le texte
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [Ex] Loupe

#6

Message par Iste »

Ha ben, j'aurai dis que le teste aurait été plus long que le changement.
Mais meme si avec cela on obtient des résultat variables, c'est vrai que ca soit etre plus rapide en moyenne.
par contre perso je ferais plutot $Z_Color_old = $Z_Color apres les deux boulces


Mais a votre avis, ce temps de latence restant est du a autoit, ou bien meme un logiciel plus avancé (mais utilisant le meme principe) n'irait pas plus vite ?
Signez ici
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [Ex] Loupe

#7

Message par tolf »

Sinon j'avais trouvé un script sur le forum anglais qui utilisait GDI+ et il n'y a pas de problème de lenteur vu que GDI+ gère la récupération des pixels et la création de l'image agrandie.
J'ai un peu bidouillé le script et on peut choisir le zoom en modifiant la valeur de la constante "$MagZoom" (elle vaut l'agrandissement utilisé).
► Afficher le texte
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [Ex] Loupe

#8

Message par sylvanie »

@Iste

le test va consommer un tout petit peu de temps comparé à la repeinte d'un carré de 10 pixels.
Du coups on va gagner un peu plus lorsqu'on arrive dans des zones semblables en couleurs, et on en perd juste un peu lorsqu'on est dans des zones de couleurs différentes.

Donc en moyenne, on gagne un peu ...

Par contre ta remarque est intéressante : $Z_Color_old = $Z_Color
car je ne pensais pas qu'Autoit procédait à une recopie de tableau. Je me méfie de ce genre d'assignation du fait que je travaille beaucoups avec des langages à pointeurs comme le C ... Je me coucherai moins bête ^^
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Répondre