Page 1 sur 1
[R] Comparaison d'image
Posté : ven. 24 juin 2011 11:10
par Fabiolito
Bonjour , j'aimerai faire quelque chose avec AutoIt , mais le problème c'est que je ne suis même pas sûr que l'option que je chercher éxiste , c'est donc pour cela que je vous demande votre aide , voici ce que je veux faire :
Soit une image sans erreure qu'on appelle image 1 et une image avec des erreures ( un trait en trop par exemple ) qu'on appelle image 2 .
Est-ce qu'il y a une option pour que le logiciel clique sur ce qu'il y a de différent sur l'image 2 par rapport à l'image 1 ?
Merci d'avance pour vos réponses .
Re: [...] Comparaison d'image
Posté : ven. 24 juin 2011 13:20
par matwachich
J'ai ce qu'il faut pour comparer 2 images (c'est extrait du forum anglais, je ne sais plus trop ou)
► Afficher le texte
Code : Tout sélectionner
#include <GDIPlus.au3>
#include <Array.au3>
;_GDIPlus_Startup()
;$img1 = _GDIPlus_ImageLoadFromFile("C:\Users\Mat\Desktop\Tofs\q49ca99310bda8.jpg")
;$img2 = _GDIPlus_ImageLoadFromFile("C:\Users\Mat\Desktop\Tofs\q49528d7e1b2cd.jpg")
;
;ConsoleWrite(CompareBitmapPixels($img1, $img2) & @CRLF)
Func CompareBitmapPixels($bm1, $bm2)
Local $Bm1W, $Bm1H, $BitmapData1, $Scan0, $Bm2W, $BitmapData2, $Bm2H
Local $Scan01, $iNum = 0, $iDiff = 0, $v_BufferA, $AllPixels
Local $sREResult1, $aArray, $v_BufferB, $AllPixelsB, $sREResult2, $aArray2
$Bm1W = _GDIPlus_ImageGetWidth($bm1)
$Bm1H = _GDIPlus_ImageGetHeight($bm1)
$BitmapData1 = _GDIPlus_BitmapLockBits($bm1, 0, 0, $Bm1W, $Bm1H, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$Scan0 = DllStructGetData($BitmapData1, "Scan0")
$Bm2W = _GDIPlus_ImageGetWidth($bm2)
$Bm2H = _GDIPlus_ImageGetHeight($bm2)
$BitmapData2 = _GDIPlus_BitmapLockBits($bm2, 0, 0, $Bm2W, $Bm2H, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$Scan01 = DllStructGetData($BitmapData2, "Scan0")
_GDIPlus_BitmapUnlockBits($bm1, $BitmapData1)
_GDIPlus_BitmapUnlockBits($bm2, $BitmapData2)
; =============
$v_BufferA = DllStructCreate("byte[" & $Bm1H * $Bm1W * 4 & "]", $Scan0) ; Create DLL structure for all pixels
$AllPixels = DllStructGetData($v_BufferA, 1)
$sREResult1 = StringRegExpReplace(StringTrimLeft($AllPixels, 2), "(.{8})", "\1 ")
$aArray = StringSplit(StringStripWS($sREResult1, 3), " ")
$v_BufferB = DllStructCreate("byte[" & $Bm2H * $Bm2W * 4 & "]", $Scan01) ; Create DLL structure for all pixels
$AllPixelsB = DllStructGetData($v_BufferB, 1)
$sREResult2 = StringRegExpReplace(StringTrimLeft($AllPixelsB, 2), "(.{8})", "\1 ")
$aArray2 = StringSplit(StringStripWS($sREResult2, 3), " ")
; ---
$iDiff = Abs($aArray2[0] - $aArray[0])
$t = TimerInit()
For $i = 1 To UBound($aArray) - 1 - $iDiff
If $aArray2[$i] <> $aArray[$i] Then $iNum += 1
Next
ConsoleWrite(TimerDiff($t) & @CRLF)
; =============
Return SetError(0, , $iNum + $iDiff)
EndFunc ;==>CompareBitmapPixels
Ca retourne le nombre de pixels différent entre 2 images.
Attention, c'est au pixel près: ça veut dire que par exemple 2 images identiques enregistrées 2 fois en jpg seront extrêmement différentes, vu que le jpg est une compression avec pertes.
Après pour cliquer sur l'erreur...
Re: [...] Comparaison d'image
Posté : ven. 24 juin 2011 14:30
par Fabiolito
Déja , merci de m'avoir répondu .
Mais , étant donné qu'il ne peux pas cliquer sur l'erreure , je pense que je vais devoir faire pixels par pixels , as-tu / avez-vous une solution pour me faciliter cette tache ?
Merci d'avance .
Re: [...] Comparaison d'image
Posté : jeu. 30 juin 2011 14:44
par legend
Si l'image est une partie de l'écran et non pas un fichier il est possible de le faire avec ce code.
Code : Tout sélectionner
;met les cordonnées de ton image
$top_x = ...
$top_y = ...
$bot_x = ...
$bot_y = ...
Dim $array[1500][1500] ; depend de la taille de ton image
sleep (2000)
for $i = $top_y to $bot_y
for $i2 = $top_x to $bot_x
$array[$1][$2] = PixelGetColor ($i, $i2)
$1 += 1
Next
$2 += 1
$1 = 0
Next
tu fait ça une fois pour chaque image (il faut être précis avec les cordonnées sinon ça marche pas)
après une boucle dans laquelle tu compare la couleur de chaque pixel.
si il y a une différence il renvoie les cordonnées du pixel par rapport a l'image.
(a toi d'ajouter le code ^^)
bonne journée.
Re: [R] Comparaison d'image
Posté : jeu. 30 juin 2011 17:18
par Fabiolito
Oé , c'est ça , merci :p