Page 1 sur 1

[Ex] Loupe

Posté : mer. 04 nov. 2009 19:18
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

Re: [Ex] Loupe

Posté : ven. 06 nov. 2009 11:05
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

Re: [Ex] Loupe

Posté : ven. 06 nov. 2009 14:00
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...

Re: [Ex] Loupe

Posté : ven. 06 nov. 2009 14:09
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 ...)

Re: [Ex] Loupe

Posté : ven. 06 nov. 2009 16:20
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

Re: [Ex] Loupe

Posté : ven. 06 nov. 2009 17:09
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 ?

Re: [Ex] Loupe

Posté : ven. 06 nov. 2009 18:25
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

Re: [Ex] Loupe

Posté : mer. 11 nov. 2009 21:53
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 ^^