davidkim Posted December 7, 2012 Share Posted December 7, 2012 (edited) this source is image retrieval using examplefirst random numeric 4 digit display.....................[start] button click is 4 digit numeric search....... point 0x00ff00 label overlap....user input number 4 digit search can........back jpg filesafe.zipexpandcollapse popup#include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <GDIPlus.au3> #include <array.au3> #include <ScreenCapture.au3> #region ### START Koda GUI section ### Form= Dim $11[10] Dim $22[10] Dim $1pic[5] Dim $2pic[10] For $i = 1 To 9 $11[$i] = @ScriptDir & "pic" & $i & ".BMP" $22[$i] = @ScriptDir & "picR" & $i & ".BMP" Next Global $back = @ScriptDir & "picback.jpg" Dim $Num[5] Global $s2, $s3 Dim $la[5] Dim $x[10] Dim $y[10] $x[1] = 3 + 138 $x[2] = 3 + 138 + 48 $x[3] = 3 + 138 + 96 $x[4] = 3 + 138 $x[5] = 3 + 138 + 48 $x[6] = 3 + 138 + 96 $x[7] = 3 + 138 $x[8] = 3 + 138 + 48 $x[9] = 3 + 138 + 96 $y[1] = 25 + 254 $y[2] = 25 + 254 $y[3] = 25 + 254 $y[4] = 25 + 254 + 48 $y[5] = 25 + 254 + 48 $y[6] = 25 + 254 + 48 $y[7] = 25 + 254 + 94 $y[8] = 25 + 254 + 94 $y[9] = 25 + 254 + 94 $Form1_1 = GUICreate("safe box", 565, 517, -1, -1) GUISetBkColor(0xFFFFFF) $Pic1 = GUICtrlCreatePic($back, 0, 0, 512, 512) GUICtrlSetState(-1, $gui_disable) $1pic[1] = GUICtrlCreatePic("", 188, 79, 33, 33) $1pic[2] = GUICtrlCreatePic("", 188 + 33, 79, 33, 33) $1pic[3] = GUICtrlCreatePic("", 188 + 66, 79, 33, 33) $1pic[4] = GUICtrlCreatePic("", 188 + 99, 79, 33, 33) $2pic[1] = GUICtrlCreatePic("", 138, 254, 48, 48) $2pic[2] = GUICtrlCreatePic("", 138 + 48, 254, 48, 48) $2pic[3] = GUICtrlCreatePic("", 138 + 96, 254, 48, 48) $2pic[4] = GUICtrlCreatePic("", 138, 254 + 48, 48, 48) $2pic[5] = GUICtrlCreatePic("", 138 + 48, 254 + 48, 48, 48) $2pic[6] = GUICtrlCreatePic("", 138 + 96, 254 + 48, 48, 48) $2pic[7] = GUICtrlCreatePic("", 138, 254 + 94, 48, 48) $2pic[8] = GUICtrlCreatePic("", 138 + 48, 254 + 94, 48, 48) $2pic[9] = GUICtrlCreatePic("", 138 + 96, 254 + 94, 48, 48) $start = GUICtrlCreateButton("start", 456, 104, 99, 25) $user_input = GUICtrlCreateInput("", 456, 144, 99, 21, $ES_NUMBER) $set = GUICtrlCreateButton("reset", 456, 176, 99, 25) $exit = GUICtrlCreateButton("exit", 456, 447, 99, 25) GUISetState(@SW_SHOW) Global $handle = WinGetHandle("safe box") #endregion ### END Koda GUI section ### set() While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $start Check_Top_Numeric() Check_Buttom_Numeric() Case $set set() Case $exit Exit EndSwitch WEnd Func set() For $i = 1 To 4 GUICtrlDelete($la[$i]) Next Dim $s_Out, $a_Chars = StringSplit('123456789', '') For $i_Count = 1 To $a_Chars[0] _ArraySwap($a_Chars[$i_Count], $a_Chars[Random(1, $a_Chars[0], 1)]) Next For $i_Count = 1 To $a_Chars[0] $s_Out &= $a_Chars[$i_Count] Next For $i = 1 To 9 GUICtrlSetImage($2pic[$i], $22[$a_Chars[$i]]) Next If GUICtrlRead($user_input) = '' Then Dim $a_ran = StringSplit('123456789', '') For $i_ct = 1 To $a_ran[0] _ArraySwap($a_ran[$i_ct], $a_ran[Random(1, $a_ran[0], 1)]) Next $ran = $a_ran[5] & $a_ran[7] & $a_ran[1] & $a_ran[3] Else $ran = GUICtrlRead($user_input) EndIf $a_ran = StringSplit($ran, '') For $i = 1 To 4 GUICtrlSetImage($1pic[$i], $11[$a_ran[$i]]) Next EndFunc ;==>set Func top_scan_numeric($1, $2, $3, $4, $save_bmp) _ScreenCapture_SetBMPFormat(4) _ScreenCapture_CaptureWnd($save_bmp, $handle, $1, $2, $3, $4, False) EndFunc ;==>top_scan_numeric Func Buttom_scan_numeric($1, $2, $save_bmp) _ScreenCapture_SetBMPFormat(4) _ScreenCapture_CaptureWnd($save_bmp, $handle, $1, $2, $1 + 48, $2 + 48, False) EndFunc ;==>Buttom_scan_numeric Func Check_Top_Numeric() FileDelete(@ScriptDir & "picT1.BMP") FileDelete(@ScriptDir & "picT2.BMP") FileDelete(@ScriptDir & "picT3.BMP") FileDelete(@ScriptDir & "picT4.BMP") top_scan_numeric(188 + 3, 79 + 25, 188 + 33 + 3, 79 + 33 + 25, @ScriptDir & "picT1.bmp") Sleep(100) top_scan_numeric(188 + 33 + 3, 79 + 25, 188 + 66 + 3, 79 + 33 + 25, @ScriptDir & "picT2.bmp") Sleep(100) top_scan_numeric(188 + 66 + 3, 79 + 25, 188 + 99 + 3, 79 + 33 + 25, @ScriptDir & "picT3.bmp") Sleep(100) top_scan_numeric(188 + 99 + 3, 79 + 25, 188 + 132 + 3, 79 + 33 + 25, @ScriptDir & "picT4.bmp") Sleep(100) _GDIPlus_Startup() For $Li = 1 To 4 For $i = 1 To 9 $hImage1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "pic" & $i & ".bmp") $iX = _GDIPlus_ImageGetWidth($hImage1) $iY = _GDIPlus_ImageGetHeight($hImage1) $hImage2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "pic" & "T" & $Li & ".bmp") $iIW = _GDIPlus_ImageGetWidth($hImage2) $iIH = _GDIPlus_ImageGetHeight($hImage2) $bm1 = _GDIPlus_BitmapCloneArea($hImage1, 0, 0, 33, 33, $GDIP_PXF32ARGB) $bm2 = _GDIPlus_BitmapCloneArea($hImage2, 0, 0, 33, 33, $GDIP_PXF32ARGB) Local $compare = CompareBitmapPixels($bm1, $bm2) $s2 = Round(100 - (Number($compare) / 2304) * 100, 0) If $s2 > 89 Then $s3 = $i _GDIPlus_BitmapDispose($bm1) _GDIPlus_BitmapDispose($bm2) _GDIPlus_ImageDispose($hImage1) _GDIPlus_ImageDispose($hImage2) Next $Num[$Li] = $s3 Next _GDIPlus_Shutdown() EndFunc ;==>Check_Top_Numeric Func Check_Buttom_Numeric() For $i = 1 To 4 GUICtrlDelete($la[$i]) Next For $i = 1 To 9 FileDelete(@ScriptDir & "picB" & $i & ".BMP") Buttom_scan_numeric($x[$i], $y[$i], @ScriptDir & "picB" & $i & ".BMP") Next _GDIPlus_Startup() For $Ri = 1 To 4 For $i = 1 To 9 $new = _GDIPlus_ImageLoadFromFile(@ScriptDir & "picB" & $i & ".bmp") $scan = _GDIPlus_ImageLoadFromFile(@ScriptDir & "picR" & $Num[$Ri] & ".bmp") $bm_new = _GDIPlus_BitmapCloneArea($new, 0, 0, 48, 48, $GDIP_PXF32ARGB) $bm_scan = _GDIPlus_BitmapCloneArea($scan, 0, 0, 48, 48, $GDIP_PXF32ARGB) $s2 = Compare_Buttom_Numeric($bm_new, $bm_scan) _GDIPlus_BitmapDispose($bm_new) _GDIPlus_BitmapDispose($bm_scan) _GDIPlus_ImageDispose($new) _GDIPlus_ImageDispose($scan) $sa = StringSplit($s2, "|", 1) If $sa[1] = $sa[2] Then $la[$Ri] = GUICtrlCreateLabel("", $x[$i] + 25, $y[$i], 4, 4) GUICtrlSetBkColor(-1, 0x00ff00) EndIf Next Next _GDIPlus_Shutdown() EndFunc ;==>Check_Buttom_Numeric Func Compare_Buttom_Numeric($bm1, $bm2);new-old 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_PXF32RGB) $Scan0 = DllStructGetData($BitmapData1, "Scan0") $Bm2W = _GDIPlus_ImageGetWidth($bm2) $Bm2H = _GDIPlus_ImageGetHeight($bm2) $BitmapData2 = _GDIPlus_BitmapLockBits($bm2, 0, 0, $Bm2W, $Bm2H, $GDIP_ILMREAD, $GDIP_PXF32RGB) $Scan01 = DllStructGetData($BitmapData2, "Scan0") $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), " ") Local $c1 = 0, $c2 = 0 For $i = 1 To $aArray[0] If $aArray[$i] = 'C2C2C2FF' Then $c1 += 1 EndIf If $aArray[$i] = 'A8A8A8FF' Then $c2 += 1 EndIf Next $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), " ") Local $d1 = 0, $d2 = 0 For $i = 1 To $aArray2[0] If $aArray2[$i] = 'C2C2C2FF' Then $d1 += 1 EndIf If $aArray2[$i] = 'A8A8A8FF' Then $d2 += 1 EndIf Next $iDiff = Abs($aArray2[0] - $aArray[0]) For $i = 1 To UBound($aArray) - 1 - $iDiff If $aArray2[$i] <> $aArray[$i] Then $iNum += 1 Next _GDIPlus_BitmapUnlockBits($bm1, $BitmapData1) _GDIPlus_BitmapUnlockBits($bm2, $BitmapData2) Return $c1 & $c2 & '|' & $d1 & $d2 EndFunc ;==>Compare_Buttom_Numeric 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_PXF32RGB) $Scan0 = DllStructGetData($BitmapData1, "Scan0") $Bm2W = _GDIPlus_ImageGetWidth($bm2) $Bm2H = _GDIPlus_ImageGetHeight($bm2) $BitmapData2 = _GDIPlus_BitmapLockBits($bm2, 0, 0, $Bm2W, $Bm2H, $GDIP_ILMREAD, $GDIP_PXF32RGB) $Scan01 = DllStructGetData($BitmapData2, "Scan0") $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]) For $i = 1 To UBound($aArray) - 1 - $iDiff If $aArray2[$i] <> $aArray[$i] Then $iNum += 1 Next _GDIPlus_BitmapUnlockBits($bm1, $BitmapData1) _GDIPlus_BitmapUnlockBits($bm2, $BitmapData2) Return $iNum + $iDiff EndFunc ;==>CompareBitmapPixelsin korea... large snowflakes ...... Edited December 7, 2012 by davidkim I interest am many quite in AutoitScript.From that is [http://cafe.naver.com/autoitscript[/color]] Korea of cafe(blog) to be operating, [size="2"][color="#ff00ff"]English cannot well[/size].Many help it requests.To read, it stands it thanks. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now