Добрый день! Решаю задачу захвата изображения на экране и его поиска в файле, создание нового изображения из отснятых.
Скрипт захватывает 2 изображения - Большое ($hLarge) , и Маленькое ($hSmall) в центре большого. Создаются их объекты $hLargeImage и $hSmallImage соответственно.
Полем поиска служит предварительно созданное изображение $hBmp (123.bmp) и его объект $hSource. $aCords = _BmpSearch($hSource, $hSmall) осуществляет определение координат маленького изображения на поле. Если изображение найдено на поле, то оно должно быть нанесено на шаблон $Map (Map.bmp) и получившееся изображение Map1.bmp должно заменить оригинальный шаблон Map.bmp, но у меня не получается удалить ни старый шаблон, ни поменять его на новый с последующим его удалением.
Помогите пожалуйста исправить код:
Скрипт захватывает 2 изображения - Большое ($hLarge) , и Маленькое ($hSmall) в центре большого. Создаются их объекты $hLargeImage и $hSmallImage соответственно.
Полем поиска служит предварительно созданное изображение $hBmp (123.bmp) и его объект $hSource. $aCords = _BmpSearch($hSource, $hSmall) осуществляет определение координат маленького изображения на поле. Если изображение найдено на поле, то оно должно быть нанесено на шаблон $Map (Map.bmp) и получившееся изображение Map1.bmp должно заменить оригинальный шаблон Map.bmp, но у меня не получается удалить ни старый шаблон, ни поменять его на новый с последующим его удалением.
Помогите пожалуйста исправить код:
Код:
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <MsgBoxConstants.au3>
#include "BmpSearch.au3"
#include <Clipboard.au3>
#include <ScreenCapture.au3>
;#include <BMP3.au3>
#include <WinAPIFiles.au3>
#include <FileConstants.au3>
;$Del = Filedelete ("Temp.bmp")
;$Del2 = Filedelete ("Map.bmp")
Global $j = 1
Global $Offset=800 ; Для экрана 1920х1080
$hForm = GUICreate('', 550, 550,1960-$Offset, 540,$WS_EX_TOPMOST + $WS_SIZEBOX + $WS_SYSMENU) ; Создаем форму для отслеживания построения карты
$PIC1 = GUICtrlCreatePic("",0,0,500,500) ; Тут отображение карты в форме
$PIC2 = GUICtrlCreatePic("",0,0,31,31) ; Тут мы видим, что захватили скриншотом
Global $LargePath = @Scriptdir & "\Large.bmp"
Global $TempPath = @Scriptdir & "\Temp.bmp"
Global $MapPath = @Scriptdir & "\Map.bmp"
Global $MapPath1 = @Scriptdir & "\Map1.bmp"
Global $MapPathTMP = @Scriptdir & "\MapTMP.bmp"
Global $SmallPath = @Scriptdir & "\Small.bmp"
HotKeySet("+!q", "_MapCreate") ; Shift-Alt-q
HotKeySet("+!e", "_Capture") ; Shift-Alt-e
HotKeySet("r", "Terminate")
Global $aCords=0
GUISetState()
_GDIPlus_Startup()
WinSetOnTop($hForm, " ", 1) ; Форма поверх всех окон
While 1
Sleep(1000)
_MapCreate()
WEnd
Func _MapCreate()
$err = False
; Local $hHighlight_Capture = GUICreate('', 31, 31, -1, -1, $WS_POPUPWINDOW, $WS_EX_CONTROLPARENT) ; подсвечиваем место, где делаем захват изображения
;GUISetState(@SW_SHOW)
; WinSetOnTop($hHighlight_Capture, '', 1)
; WinMove($hHighlight_Capture, '', 2269-$Offset, 244)
;Sleep (1000) ; Водсвечиваем область 1 сек
; GUIDelete($hHighlight_Capture) ; Удаляем подсветку
$hSmall = _ScreenCapture_Capture('', 2269-$Offset, 244, 2269-$Offset + 12, 244 + 12) ;Захватываем "маленькое" изображение
$hLarge = _ScreenCapture_Capture('', 2260-$Offset, 235, 2290-$Offset, 265) ;Захватываем "большое" изображение
$hLargeImage = _GDIPlus_BitmapCreateFromHBITMAP ($hLarge) ; Создаем объект
_GDIPlus_ImageSaveToFile ($hLargeImage,$TempPath) ; Сохраняем в файл на сякий случай
$hSmallImage = _GDIPlus_BitmapCreateFromHBITMAP ($hSmall) ; Создаем объект
_GDIPlus_ImageSaveToFile ($hSmallImage,$SmallPath) ; Сохраняем в файл на сякий случай
GUICtrlSetImage($PIC2,$TempPath); Выводим картики в форму
GUICtrlSetImage($PIC1,$MapPath)
GUISetState()
Local $hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\123.bmp") ;На этой картике мы ищем "маленькое" изображение <<<
Local $hSource = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp); Создаем объект
$aCords = _BmpSearch($hSource, $hSmall); Ищем изображение
If @error Then
ConsoleWrite("Не найдено" & @CRLF)
MsgBox(0, "NO MATCHES", "No Matches Found!" & $j)
Else
ConsoleWrite("X:" & $aCords[1][2] & " Y:" &$aCords[1][3] & " time:" & @extended & @CRLF)
WinSetTitle($hForm, 'Found', "X:" & $aCords[1][2] & " Y:" & $aCords[1][3]& " J:" & $j ) ;Пишем в заголовк координаты найденного изображения
$Path = (@Scriptdir & "\Temp\Temp"& $j& ".bmp")
_GDIPlus_ImageSaveToFile ($hLargeImage,$Path)
GUICtrlCreatePic($Path,(($aCords[1][2])-9),(($aCords[1][3])-9),31,31) ; Заполняем форму захваченными изображениями
GUICtrlSetImage(-1,$Path)
GUISetState()
$j+=1
Local $Map = _GDIPlus_BitmapCreateFromFile($MapPath) ;Открываем шаблон карты
Local $hGraphic = _GDIPlus_ImageGetGraphicsContext($Map) ;Получаем графический контекст
_GDIPlus_GraphicsDrawImage($hGraphic, $hLargeImage, (($aCords[1][2])-9), (($aCords[1][3])-9)) ; Наносим отснятое изображение в шаблон карты в найденные координаты
_GDIPlus_ImageSaveToFile ($Map,$MapPath1); Сохраняем шаблон в новый файл
EndIf
;Чистим ресурсы
_WinAPI_DeleteObject($hSource)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hLargeImage)
_GDIPlus_ImageDispose($hSmallImage)
_GDIPlus_PathDispose($MapPath)
_GDIPlus_PathDispose($MapPath1)
_WinAPI_DeleteObject($hSmall)
_WinAPI_DeleteObject($hLarge)
_WinAPI_DeleteObject($Map)
Local $iDelete = FileDelete($MapPath) ;Удаляем шаблон
If $iDelete Then
; MsgBox($MB_SYSTEMMODAL, "", "The file was successfuly deleted.")
Else
MsgBox($MB_SYSTEMMODAL, "", "An error occurred whilst deleting the file.1")
EndIf
FileMove($MapPath1,$MapPathTMP, $FC_OVERWRITE + $FC_CREATEPATH) ;Копируем результат наложения изображений во временный файл
FileMove($MapPathTMP,$MapPath, $FC_OVERWRITE + $FC_CREATEPATH) ;Заменяем шаблон на новый
_GDIPlus_PathDispose($MapPath1)
FileClose($MapPath1)
Local $iDelete1 = FileDelete($MapPath1); Удаляем файл
If $iDelete1 Then
; MsgBox($MB_SYSTEMMODAL, "", "The file was successfuly deleted.")
Else
MsgBox($MB_SYSTEMMODAL, "", "An error occurred whilst deleting the file.2")
EndIf
Local $iDelete2 = FileDelete($MapPathTMP); Удаляем файл
If $iDelete2 Then
; MsgBox($MB_SYSTEMMODAL, "", "The file was successfuly deleted.")
Else
MsgBox($MB_SYSTEMMODAL, "", "An error occurred whilst deleting the file.3")
EndIf
EndFunc ;==>_MapCreate
Func Terminate()
Exit
EndFunc ;==>Terminate