Что нового

[Автоматизация] Захват и обработка изображения, удаление временных файлов

thehero

Новичок
Сообщения
7
Репутация
0
Добрый день! Решаю задачу захвата изображения на экране и его поиска в файле, создание нового изображения из отснятых.
Скрипт захватывает 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
 
Автор
T

thehero

Новичок
Сообщения
7
Репутация
0
Изменил код так, что бы было проще протестировать, но суть не поменялась

Код:
#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")
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) ;Захватываем "маленькое" изображение
	  $hSmall = _GDIPlus_BitmapCreateFromFile($SmallPath)
      ;$hLarge = _ScreenCapture_Capture('', 2260-$Offset, 235, 2290-$Offset, 265)    ;Захватываем "большое" изображение
	  $hLarge = _GDIPlus_BitmapCreateFromFile($TempPath)
      $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:" & 250 & " Y:" &$aCords[1][3] & " time:" & @extended & @CRLF)
 WinSetTitle($hForm,   'Found', "X:" & "250" & " Y:" & "250" & " J:"  & $j ) ;Пишем в заголовк координаты найденного изображения

      $Path = (@Scriptdir & "\Temp\Temp"& $j& ".bmp")
      _GDIPlus_ImageSaveToFile ($hLargeImage,$Path)
      GUICtrlCreatePic($Path,(250-9),(250-9),31,31) ; Заполняем форму захваченными изображениями
      GUICtrlSetImage(-1,$Path)
      GUISetState()
      $j+=1

     Local $Map = _GDIPlus_BitmapCreateFromFile($MapPath) ;Открываем шаблон карты
     Local $hGraphic = _GDIPlus_ImageGetGraphicsContext($Map) ;Получаем графический контекст
      _GDIPlus_GraphicsDrawImage($hGraphic, $hLargeImage, (250-9), (250-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)
	  FileClose($MapPath)
      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


И картинки вышлю по почте, не могу вставить bmp, они весят больше 200кб.



Добавлено:
Сообщение автоматически объединено:

Решил проблему методом тыка, добавлял на все подряд _GDIPlus_ImageDispose($Map) и помогло. Сообщения о неудачном удалении вылезают, но файлы пропадают.
 
Верх