Автор Тема: [Автоматизация] Есть ли в Autoit поиск картинки в заданной области экрана?  (Прочитано 6908 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Tapok [?]

  • Новичок
  • *
  • Сообщений: 195
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Есть ли в Autoit поиск картинки в заданной области экрана?

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

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

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

Очень бы хотелось, чтобы нечто подобное оказалось и в Autoit.
« Последнее редактирование: Май 17, 2015, 13:03:24 от Tapok »

Русское сообщество AutoIt


Помечен как лучший ответ пользователем Tapok Отправлен Май 17, 2015, 21:39:01

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3579
  • Репутация: 947
    • Награды
  • Версия AutoIt: 3.3.14.0
Tapok
Цитировать
Есть ли в Autoit поиск картинки
Встроенных функций нет. Но есть UDF, использующие DLL.

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

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

Код: AutoIt [Выделить]
#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


Оффлайн Tapok [?]

  • Новичок
  • *
  • Сообщений: 195

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
InnI, спасибо большое, работает! :IL_AutoIt_1:


Оффлайн IgorFIN [?]

  • Новичок
  • *
  • Сообщений: 3
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
InnI , что может быть у меня не так с системой

Так работает
Скрытый текст:Войдите или Зарегистрируйтесь чтобы увидеть скрытый текст


Так нет
Скрытый текст:Войдите или Зарегистрируйтесь чтобы увидеть скрытый текст


W7 x86


Добавлено: Июль 11, 2016, 12:20:09
Разобрался, так работает

Код: AutoIt [Выделить]
#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
 

« Последнее редактирование: Июль 11, 2016, 12:20:10 от IgorFIN, Причина: Объединение сообщений »

Русское сообщество AutoIt


Оффлайн querubin_new [?]

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

:stars:  :stars:  :stars:

Код: AutoIt [Выделить]
#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 Гуру
  • *****
  • Сообщений: 3579
  • Репутация: 947
    • Награды
  • Версия AutoIt: 3.3.14.0
querubin_new
Предыдущий пост прочитайте, что ли... или Aero включите.

Оффлайн querubin_new [?]

  • Bolo
  • Новичок
  • *
  • Сообщений: 10
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Посмотрел, проверил, отак робэ  :)

Код: AutoIt [Выделить]
#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

 


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

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


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

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3579
  • Репутация: 947
    • Награды
  • Версия AutoIt: 3.3.14.0
querubin_new
Цитировать
хочеться понять смысл
Функции GDI и GDIPlus по разному возвращают прозрачность. В одном случае зелёный, например, возвращается как 0000FF00, в другом как FF00FF00. А функция _WinAPI_BitBlt, используемая в _ScreenCapture_Capture, даже по разному возвращает прозрачность при "фотографировании" окна блокнота и окна калькулятора. Также разная прозрачность получается на Win7 при выборе упрощённой темы оформления (с выключенным Aero). Поэтому приходится всё "приводить" к одному виду через дополнительные преобразования.

Русское сообщество AutoIt


Оффлайн querubin_new [?]

  • Bolo
  • Новичок
  • *
  • Сообщений: 10
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
 InnI  :beer:

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

Спасибо за пояснения. Теперь я понял. Уверен, это очень полезная информация и пригодится многим. Однозначно, тему в закладки для справки.
« Последнее редактирование: Август 06, 2016, 13:44:30 от querubin_new »

Оффлайн NickSpirit [?]

  • Новичок
  • *
  • Сообщений: 30
  • Репутация: 5
    • Награды
  • Версия AutoIt: 3.3.14.0
Понимаю тема старая но появился вопрос -

У меня при выполнении скрипта появляется ошибка:
сам скрипт
Код: AutoIt [Выделить]

#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
 



Код: AutoIt [Выделить]
"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
 


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

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3579
  • Репутация: 947
    • Награды
  • Версия AutoIt: 3.3.14.0
NickSpirit
Цитировать
Что мне надо сделать?
Прочитать предыдущие посты. Желательно все.

Оффлайн NickSpirit [?]

  • Новичок
  • *
  • Сообщений: 30
  • Репутация: 5
    • Награды
  • Версия AutoIt: 3.3.14.0
Прочитал. Не очень понимаю что я в них упустил. Если можно скажите что я недоглядел...

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3579
  • Репутация: 947
    • Награды
  • Версия AutoIt: 3.3.14.0
NickSpirit
Скорее всего ваша проблема с файлом test.bmp. Либо файл не найден, либо он не bmp, либо ещё что-то. У вас всего три функции. Проверьте каждую на наличие ошибки и определите проблему.

Оффлайн NickSpirit [?]

  • Новичок
  • *
  • Сообщений: 30
  • Репутация: 5
    • Награды
  • Версия AutoIt: 3.3.14.0
В итоге для того чтобы заработало пришлось делать искомые картинки вот таким способом:

Код: AutoIt [Выделить]
 ; 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 Гуру
  • *****
  • Сообщений: 3579
  • Репутация: 947
    • Награды
  • Версия AutoIt: 3.3.14.0
NickSpirit
Цитировать
Потом вырезать из изображения нужную часть
Зачем "потом"? Можно сразу клонировать нужную часть. Там же координаты для этого есть.

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

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
10 Ответов
4700 Просмотров
Последний ответ Январь 29, 2012, 05:14:05
от teges
10 Ответов
4854 Просмотров
Последний ответ Апрель 10, 2013, 01:44:20
от saansan
6 Ответов
3417 Просмотров
Последний ответ Май 12, 2012, 14:16:38
от Ganibal95
6 Ответов
3931 Просмотров
Последний ответ Февраль 20, 2013, 21:56:09
от madmasles
1 Ответов
1977 Просмотров
Последний ответ Февраль 26, 2014, 22:31:13
от alex33
0 Ответов
1587 Просмотров
Последний ответ Май 17, 2014, 12:27:40
от krsnadas
12 Ответов
2423 Просмотров
Последний ответ Ноябрь 21, 2014, 21:46:16
от Rakoobrazny213
4 Ответов
1543 Просмотров
Последний ответ Декабрь 03, 2014, 19:22:31
от GunGrave12
0 Ответов
609 Просмотров
Последний ответ Декабрь 03, 2014, 08:36:38
от madmasles
0 Ответов
2248 Просмотров
Последний ответ Август 19, 2015, 22:22:52
от Yashied