Добрый день уважаемые форумчане, есть скрипт поиска определенных объектов на экране через PixelSearch, на WinXP все работает отлично, на Windows 7 (32 bit) тоже все нормально, стоит запустить на Windows 8 (64bit) работает раз в 100 медленнее. В чем может быть причина ?
Скрипт ниже. Чтобы было более понятно что он делает, ниже ссылка на архив скрипта, внутри несколько анализируемых файлов.
http://yadi.sk/d/hQRw5UuPHoKQm
Буду благодарен за подсказки, а то из за этого приходится все делать на 2х компьютерах. формирование скриншотов на одном, анализ на другом, а так все бы на одном делалось.
P.S. для работы сделайте файлик 1-1-1.jpg и поместите его в корень диска C:
Скрипт ниже. Чтобы было более понятно что он делает, ниже ссылка на архив скрипта, внутри несколько анализируемых файлов.
http://yadi.sk/d/hQRw5UuPHoKQm
Буду благодарен за подсказки, а то из за этого приходится все делать на 2х компьютерах. формирование скриншотов на одном, анализ на другом, а так все бы на одном делалось.
P.S. для работы сделайте файлик 1-1-1.jpg и поместите его в корень диска C:
Код:
; Анализ скриншотов и формирование файла планет на которых есть обломки
#include <ScreenCapture.au3>
#include <GDIP.au3>
#include <Array.au3>
HotKeySet("{ESC}", "Terminate")
$Form1 = GUICreate("Скрины", 552, 641)
$Pic1 = GUICtrlCreatePic("c:\1-1-1.jpg", 0, 0, 552, 641)
GUISetState()
$xn = WinGetPos ("Скрины")
$file = FileOpen ("gala.csv", 0)
; Check if file opened for reading OK
If $File = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
While 1
$line = FileReadLine($File)
If @error = -1 Then ExitLoop
$coord = StringSplit ($line,";") ; coord[1] - Galaxy; coord[2] - System; coord[3] - Planet
GUICtrlSetImage($Pic1, $coord[1] & "-" & $coord[2] & "-" & $coord[3] & ".jpg") ; Вывели картинку
; Координаты области в которой производится поиск
$x1 = $xn[0]+5 + 35 ; 41 это чтобы он не искал за пределами экрана
$y1 = $xn[1] + 35 ; + 30 это отступ сверху
$x2 = $xn[0]+$xn[2] - 5 - 35
$y2 = $xn[1]+$xn[3] - 5 - 35
$xt = $x1
$yt = $y1
$ssp = 3
; ------------------------------------------------
_GDIPlus_Startup()
$hBitmap = _GDIPlus_BitmapCreateFromScan0 ( $x2-$x1, $y2-$y1 )
While 1
$pixel = PixelSearch ( $x1, $y1, $x2, $y1, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
If @error Then ;Если пиксель не найден по всему X
$y1 = $y1 + $ssp ; Будем сканить через строку, чтобы быстрее
$x1 = $xt
Else
If @error = 0 Then ; ----------------------- Если пиксель найден, то дальше будем смотреть есть ли пиксели по опорным точкам.
;MouseMove ($pixel[0], $pixel[1])
$pz = 0
$pt = PixelSearch ( $pixel[0] - 13, $pixel[1] + 21, $pixel[0] - 13, $pixel[1] + 21, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
If @error = 0 Then
;MouseMove ($pixel[0] - 22, $pixel[1] + 24)
$pz += 1
EndIf
$pt = PixelSearch ( $pixel[0] - 3, $pixel[1] + 33, $pixel[0] - 3, $pixel[1] + 33, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
If @error = 0 Then
;MouseMove ($pixel[0] - 23, $pixel[1] + 24)
$pz += 1
EndIf
$pt = PixelSearch ( $pixel[0] + 18, $pixel[1] + 0, $pixel[0] + 18, $pixel[1] + 0, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
If @error = 0 Then
;MouseMove ($pixel[0] - 21, $pixel[1] + 24)
$pz += 1
EndIf
$pt = PixelSearch ( $pixel[0] + 29, $pixel[1] + 18, $pixel[0] + 29, $pixel[1] + 18, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
If @error = 0 Then
;MouseMove ($pixel[0] + 14, $pixel[1] + 24)
$pz += 1
EndIf
$pt = PixelSearch ( $pixel[0] + 26, $pixel[1] + 30, $pixel[0] + 26, $pixel[1] + 30, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
If @error = 0 Then
;MouseMove ($pixel[0] + 15, $pixel[1] + 24)
$pz += 1
EndIf
$pt = PixelSearch ( $pixel[0] + 23, $pixel[1] + 33, $pixel[0] + 23, $pixel[1] + 33, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
If @error = 0 Then
;MouseMove ($pixel[0] + 13, $pixel[1] + 24)
$pz += 1
EndIf
If $pz = 6 Then ; Если все точки совпали, записываем в файлик
FileWriteLine ("move.bat", "move /Y " & $coord[1] & "-" & $coord[2] & "-" & $coord[3] & ".jpg, Planet/")
$y1 = $y2
EndIf
$pz = 0
#comments-start
#comments-end
; _GDIPlus_BitmapSetPixel ( $hBitmap, $pixel[0]-$xt, $pixel[1]-$yt, 0xFF0007ff )
EndIf
$x1 = $pixel[0] ; координата X, будет X найденного пиксела, чтобы не терять время
$x1 = $x1 + 1
EndIf
If $x1 >= $x2 Then
$x1 = $xt
$y1 = $y1 + $ssp ; Будем сканить через строку, чтобы быстрее
Endif
;ToolTip ($x1 & " " &$y1, 0, 0)
If $y1 >= $y2 Then
ExitLoop
EndIf
WEnd
;_GDIPlus_ImageSaveToFile($hBitmap, "png/" & $coord[1] & "-" & $coord[2] & "-" & $coord[3] & ".png") ;save bitmap to disk
;_GDIPlus_Shutdown()
Wend
FileClose($file)
Func Terminate()
Exit 0
EndFunc