Что нового

Поиск на экране изображения из файла

edyapd

Осваивающий
Сообщения
380
Репутация
30
Не могу понять, как правильно получить дескриптор изображения из файла?
Есть вот такой код
Код:
#include <screencapture.au3>
#include <array.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <MsgBoxConstants.au3>
#include "BmpSearch.au3"
#include <WinAPI.au3>

Global $pause = False
Global $exit = False
Global $hFind

HotKeySet('{F4}', '_pause')
Func _pause()
	$pause = True
EndFunc

HotKeySet('{Pause}', '_exit')
Func _exit()
	$exit = True
EndFunc

Local $hHighlight_Capture = GUICreate('', 20, 20, -1, -1, $WS_POPUPWINDOW, $WS_EX_CONTROLPARENT)

GUISetState(@SW_SHOW)
WinSetOnTop($hHighlight_Capture, '', 1)
GUISetBkColor(0x0000FF, $hHighlight_Capture)
WinSetTrans($hHighlight_Capture, '', 120)

ConsoleWrite('Наведите квадрат на то, что требуется найти и нажмите F4' & @LF)
Do
	Sleep(100)
Until $pause
$pause = False

$aPos = WinGetPos($hHighlight_Capture)
GUIDelete($hHighlight_Capture)
Sleep(500)

$answer = '1.bmp'
_ScreenCapture_SetBMPFormat(0)
$hFind = _ScreenCapture_Capture('', $aPos[0], $aPos[1], $aPos[0] + $aPos[2], $aPos[1] + $aPos[3])
;~ _ScreenCapture_Capture($answer, $aPos[0], $aPos[1], $aPos[0] + $aPos[2], $aPos[1] + $aPos[3]) ; Сохранение в файл

;~ $hFind = _WinAPI_LoadImage(0, $answer, $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE) ; Похоже, что используется не правильно !!!

Do
	Sleep(500)
	If $pause Then
		_Search()
		$pause = False
	EndIf
Until $exit
_WinAPI_DeleteObject($hFind)

Func _Search()
	_ScreenCapture_SetBMPFormat(0)
	Local $hSource = _ScreenCapture_Capture('')

	Local $aCords = _BmpSearch($hSource, $hFind)
	If Not @error Then
		$iTime = @extended / 1000

		If $aCords[0][0] > 100 Then
			_ArrayDisplay($aCords)
		Else
			Local $aGUI[$aCords[0][0] + 1]
			For $i = 1 To $aCords[0][0]
				ConsoleWrite($aCords[$i][0] & ',' & $aCords[$i][1] & ',' & $aCords[$i][2] & ',' & $aCords[$i][3] & @LF)
				$aGUI[$i] = GUICreate("", $aCords[$i][0], $aCords[$i][1], $aCords[$i][2], $aCords[$i][3], $WS_POPUPWINDOW, $WS_EX_CONTROLPARENT)
				GUISetBkColor(0xFFFF00, $aGUI[$i])
				WinSetTrans($aGUI[$i], '', 120)
				GUISetState(@SW_SHOW)
			Next
			Sleep(2000)
;~ 			MsgBox(0, 'Found', $aCords[0][0] & ' matches found. Time = ' & $iTime & ' ms')

			For $i = 1 To UBound($aGUI) - 1
				GUIDelete($aGUI[$i])
			Next
		EndIf

	Else
		ConsoleWrite('No Matches Found!' & @LF)
	EndIf

	_WinAPI_DeleteObject($hSource)

EndFunc   ;
В таком виде работает и ищет. Если же раскомментировать строки работы с файлом, то уже не находит сохранёное изображение. Подскажите, что не правильно?
 
Автор
E

edyapd

Осваивающий
Сообщения
380
Репутация
30
Если заменить
Код:
$hFind = _WinAPI_LoadImage(0, $answer, $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE)

На
Код:
_GDIPlus_Startup ()
$hBmp1 = _GDIPlus_BitmapCreateFromFile($answer)
$hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp1)

То тоже ничего не находит.
Вроди тем на форуме достаточно, но либо не решены, либо не совсем понятный для меня код.
Может кто-нибудь разжевать? Почему-то казалось, что это довольно-таки просто должно быть.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Возможно это из за _ScreenCapture_SetBMPFormat(0), у меня без этой опции все работает.
 
Автор
E

edyapd

Осваивающий
Сообщения
380
Репутация
30
Да, совершенно верно. У меня тоже заработало без неё. Хотя если судить по описанию, с этой командой наоборот должно уверенее определяться, так как задействовано меньше цветов.
Правда заработал только вариант с _WinAPI, а _GDIPlus так и не находит. Впрочем это уже не так важно.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
edyapd
заработал только вариант с _WinAPI
У меня на Win7 данный вариант работает только при выключенном Aero.

_GDIPlus так и не находит
Пример поиска "чистого" bmp: Ответ #1
Пример поиска bmp с изменением глубины цвета: Ответ #3

с этой командой наоборот должно уверенее определяться
Функция _ScreenCapture_SetBMPFormat используется для указания глубины цвета только при сохранении в файл. Обычный же снимок окна/экрана производится "как есть" и его нужно обработать при помощи _GDIPlus_BitmapCloneArea (см. пример выше).
 
Автор
E

edyapd

Осваивающий
Сообщения
380
Репутация
30
InnI сказал(а):
Это попытаюсь потестировать вечером.

InnI сказал(а):
А этот пример по сути я и приводил. Во втором сообщении в этой теме я как раз с него и брал строчки.
Windows XP SP2. Даже после того как убрал _ScreenCapture_SetBMPFormat(0), он всё равно не заработал. Попробую ещё раз, но не уверен.
 
Верх