Что нового

[Автоматизация] Есть ли в Autoit поиск картинки в заданной области экрана?

Статус
Закрыто для дальнейших ответов.

Tapok

Новичок
Сообщения
204
Репутация
0
Есть ли в Autoit поиск картинки в заданной области экрана?

Например в Clickermann эта задача решается в 4 строки:

Код:
GETSCREEN
IF_PICTURE_IN (834,492,894,557, "bmp\1.bmp")
	LOGWRITE ("1")
END_IF

Причем поиск происходит мгновенно.

Очень бы хотелось, чтобы нечто подобное оказалось и в Autoit.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Tapok
Есть ли в Autoit поиск картинки
Встроенных функций нет. Но есть UDF, использующие DLL.

Самая распространённая: ImageSearch.au3 и все что связано с этой библиотекой

Но есть и посвежее: BmpSearch - Search for Bitmap within Bitmap - Assembly Version

Код:
#include <ScreenCapture.au3>
#include "BmpSearch.au3"

_GDIPlus_Startup()

$hSource = _ScreenCapture_Capture()
$hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\test.bmp")
$hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)

$aCoords = _BmpSearch($hSource, $hFind, 1)

If @error Then
  ConsoleWrite("Не найдено" & @CRLF)
Else
  ConsoleWrite("X:" & $aCoords[1][2] & " Y:" & $aCoords[1][3] & " time:" & @extended & @CRLF)
EndIf
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
InnI, спасибо большое, работает! :IL_AutoIt_1:
 

IgorFIN

Новичок
Сообщения
6
Репутация
1
InnI , что может быть у меня не так с системой

Так работает
[hide]
Код:
#include <ScreenCapture.au3>
#include <BmpSearch.au3>

_GDIPlus_Startup()

;$hSource = _ScreenCapture_Capture()
_ScreenCapture_Capture(@ScriptDir & "\Screen.png", 0, 0, -1, -1, false)
$hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\Screen.png")
$hSource = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)

$hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\Test.bmp")
$hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)

$aCoords = _BmpSearch($hSource, $hFind, 1)

If @error Then
  ConsoleWrite("No" & @CRLF)
Else
  ConsoleWrite("X:" & $aCoords[1][2] & " Y:" & $aCoords[1][3] & " time:" & @extended & @CRLF)
EndIf

[/hide]

Так нет
[hide]
Код:
#include <ScreenCapture.au3>
#include <BmpSearch.au3>

_GDIPlus_Startup()

$hSource = _ScreenCapture_Capture()
;_ScreenCapture_Capture(@ScriptDir & "\Screen.png", 0, 0, -1, -1, false)
;$hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\Screen.png")
;$hSource = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)

$hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\Test.bmp")
$hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)

$aCoords = _BmpSearch($hSource, $hFind, 1)

If @error Then
  ConsoleWrite("No" & @CRLF)
Else
  ConsoleWrite("X:" & $aCoords[1][2] & " Y:" & $aCoords[1][3] & " time:" & @extended & @CRLF)
EndIf

[/hide]

W7 x86


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

Разобрался, так работает

Код:
#include <ScreenCapture.au3>
#include <BmpSearch.au3>

_GDIPlus_Startup()

$hBitmap = _ScreenCapture_Capture()
$hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap)
$hSource = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)

$hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\test.bmp")
$hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)

$aCoords = _BmpSearch($hSource, $hFind, 1)

If @error Then
  ConsoleWrite("Не найдено" & @CRLF)
Else
  ConsoleWrite("X:" & $aCoords[1][2] & " Y:" & $aCoords[1][3] & " time:" & @extended & @CRLF)
EndIf
 

querubin_new

Новичок
Сообщения
10
Репутация
0
InnI, сохраняю руками файл test.bmp, НЕ РАБОТАЕТ! всё время пишет = не найдено! в чем проблема?? мне нужно сохранить эталоны картинок, а потом их сравнивать, как реализовать?

:stars: :stars: :stars:

Код:
#include <ScreenCapture.au3>
#include "BmpSearch.au3"

_GDIPlus_Startup()

$hSource = _ScreenCapture_Capture()
$hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\test.bmp")
$hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)

$aCoords = _BmpSearch($hSource, $hFind, 1)

If @error Then
  ConsoleWrite("Не найдено" & @CRLF)
Else
  ConsoleWrite("X:" & $aCoords[1][2] & " Y:" & $aCoords[1][3] & " time:" & @extended & @CRLF)
EndIf
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
querubin_new
Предыдущий пост прочитайте, что ли... или Aero включите.
 

querubin_new

Новичок
Сообщения
10
Репутация
0
Посмотрел, проверил, отак робэ :smile:

Код:
#include <ScreenCapture.au3>
#include <BmpSearch.au3>

_GDIPlus_Startup()

$hBitmap = _ScreenCapture_Capture()
$hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap)
$hSource = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)

$hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\test.bmp")
$hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)

$aCoords = _BmpSearch($hSource, $hFind, 1)

If @error Then
  ConsoleWrite("Не найдено" & @CRLF)
Else
  ConsoleWrite("X:" & $aCoords[1][2] & " Y:" & $aCoords[1][3] & " time:" & @extended & @CRLF)
EndIf


единственное, неясен смысл этих преобразований:

Код:
$hBitmap = _ScreenCapture_Capture() ; и так возврвщвет HBITMAP
$hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap) ; зачем ???
$hSource = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) ; зачем ???


_ScreenCapture_Capture() = возвращает дескриптор HBITMAP , а выходит мы преобразуем HBITMAP в битмап а потом наоборот ???
объясните, пожалуйста? хочеться понять смысл, а не просто использовать чужой код ...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
querubin_new
хочеться понять смысл
Функции GDI и GDIPlus по разному возвращают прозрачность. В одном случае зелёный, например, возвращается как 0000FF00, в другом как FF00FF00. А функция _WinAPI_BitBlt, используемая в _ScreenCapture_Capture, даже по разному возвращает прозрачность при "фотографировании" окна блокнота и окна калькулятора. Также разная прозрачность получается на Win7 при выборе упрощённой темы оформления (с выключенным Aero). Поэтому приходится всё "приводить" к одному виду через дополнительные преобразования.
 

querubin_new

Новичок
Сообщения
10
Репутация
0
InnI :beer:

Функции GDI и GDIPlus по разному возвращают прозрачность. В одном случае зелёный, например, возвращается как 0000FF00, в другом как FF00FF00. А функция _WinAPI_BitBlt, используемая в _ScreenCapture_Capture, даже по разному возвращает прозрачность при "фотографировании" окна блокнота и окна калькулятора. Также разная прозрачность получается на Win7 при выборе упрощённой темы оформления (с выключенным Aero). Поэтому приходится всё "приводить" к одному виду через дополнительные преобразования.

Спасибо за пояснения. Теперь я понял. Уверен, это очень полезная информация и пригодится многим. Однозначно, тему в закладки для справки.
 

NickSpirit

Знающий
Сообщения
44
Репутация
5
Понимаю тема старая но появился вопрос -

У меня при выполнении скрипта появляется ошибка:
сам скрипт
Код:
#include <ScreenCapture.au3>
#include <BmpSearch.au3>
Sleep(3000)
_GDIPlus_Startup()

$hSource = _ScreenCapture_Capture()
$hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\test.bmp")
$hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)



$aCoords = _BmpSearch($hSource, $hFind, 1)

If @error Then
  ConsoleWrite("Не найдено" & @CRLF)
Else
  ConsoleWrite("X:" & $aCoords[1][2] & " Y:" & $aCoords[1][3] & " time:" & @extended & @CRLF)

EndIf



Код:
"C:\Program Files (x86)\AutoIt3\Include\BmpSearch.au3" (46) : ==> Variable must be of type "Object".:
Local $iRowInc = ($tSizeSource.X - $tSizeFind.X) * 4
Local $iRowInc = ($tSizeSource.X - $tSizeFind^ ERROR


Что мне надо сделать?
 

NickSpirit

Знающий
Сообщения
44
Репутация
5
Прочитал. Не очень понимаю что я в них упустил. Если можно скажите что я недоглядел...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
NickSpirit
Скорее всего ваша проблема с файлом test.bmp. Либо файл не найден, либо он не bmp, либо ещё что-то. У вас всего три функции. Проверьте каждую на наличие ошибки и определите проблему.
 

NickSpirit

Знающий
Сообщения
44
Репутация
5
В итоге для того чтобы заработало пришлось делать искомые картинки вот таким способом:

Код:
; Capture 32 bit bitmap
    $hBMP = _ScreenCapture_Capture ("")
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBMP)

    ; Create 24 bit bitmap clone
    $iX = _GDIPlus_ImageGetWidth ($hImage)
    $iY = _GDIPlus_ImageGetHeight ($hImage)
    $hClone = _GDIPlus_BitmapCloneArea ($hImage, 0, 0, $iX, $iY, $GDIP_PXF24RGB)

    ; Save bitmap to file
    _GDIPlus_ImageSaveToFile ($hClone, @MyDocumentsDir & "\GDIPlus_Image.bmp")


Потом вырезать из изображения нужную часть и только после этого поиск заработал. Если делать просто через PrtScreen + Paint - ничего не работает.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
NickSpirit
Потом вырезать из изображения нужную часть
Зачем "потом"? Можно сразу клонировать нужную часть. Там же координаты для этого есть.

через PrtScreen + Paint - ничего не работает
У меня на Win7 с включённым Aero при сохранении через Paint в 24-разрядный bmp всё прекрасно работает :scratch:
 

NickSpirit

Знающий
Сообщения
44
Репутация
5
Хм...сейчас задумался.. Я до этого делал как - снимал скриншот, вставлял в пэйнт, сохранял а обрезал уже в Microsoft Office Picture Manager. Сейчас попробовал сделать и сразу же обрезать и сохранить в Paint - работает. Однако вот в чем причина.
 
Статус
Закрыто для дальнейших ответов.
Верх