т.к. в настоящее время не существует поиска изображений с небольшими вариациями (изменение оттенка отдельных пикселей), то решил попробовать склеить вместе два способа.
Имеем изображение на экране : темный фон и белый текст (это игра, поэтому оттенки некоторых пикселей могут изменяться). Поэтому BMPsearch.au3 работает не стабильно.
Поэтому была модифицирована картинка для поиска. В ней осталось два цвета пикселей: черный (0x000000) и зеленый (0x00FF00).
Далее делаем скриншот участка окна, также модифицируем окно, оставляя (точнее заменяя), все светлые пиксели на зеленый цвет, а все темные на черный цвет.
После этого уже используем библиотеку BMPsearch.au3
Темный фон на экране может отличаться по яркости (чуть-темнее, чуть светлее), на подготовленных изображениях разницы нет, но поиск уже не работает.
Подготовка файла шаблона:
Собственно сам поиск:
Поиск происходит в области
temp.bmp
файл 1.bmp находит
файл 2.bmp не находит.
Как всегда, после описания проблемы, пришло озарение.
Тема закрыта.
Модераторы, удалите тему.
Имеем изображение на экране : темный фон и белый текст (это игра, поэтому оттенки некоторых пикселей могут изменяться). Поэтому BMPsearch.au3 работает не стабильно.
Поэтому была модифицирована картинка для поиска. В ней осталось два цвета пикселей: черный (0x000000) и зеленый (0x00FF00).
Далее делаем скриншот участка окна, также модифицируем окно, оставляя (точнее заменяя), все светлые пиксели на зеленый цвет, а все темные на черный цвет.
После этого уже используем библиотеку BMPsearch.au3
Темный фон на экране может отличаться по яркости (чуть-темнее, чуть светлее), на подготовленных изображениях разницы нет, но поиск уже не работает.
Подготовка файла шаблона:
Код:
Func _modfile($picture)
$__g_iBMPFormat = $GDIP_PXF04INDEXED
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($picture)
$iW = _GDIPlus_ImageGetWidth($hImage)
$iH = _GDIPlus_ImageGetHeight($hImage)
$hClone = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iW, $iH, $__g_iBMPFormat)
$tBits = _GDIPlus_BitmapLockBits($hClone, 0, 0, $iW, $iH, BitOR($GDIP_ILMWRITE, $GDIP_ILMREAD))
$iScan0 = DllStructGetData($tBits, "Scan0")
$tPixel = DllStructCreate("int[" & $iW * $iH & "];", $iScan0)
For $iY = 0 To $iH - 1
$iOffset = $iY * $iW + 1
For $iX = 0 To $iW - 1
$iColor = DllStructGetData($tPixel, 1, $iOffset + $iX)
$iR = BitAND(BitShift($iColor, 16), 0xFF)
$iG = BitAND(BitShift($iColor, 8), 0xFF)
$iB = BitAND($iColor, 0xFF)
If $iR > 70 And $iG > 70 And $iB > 70 Then DllStructSetData($tPixel, 1, 0x00FF00, $iOffset + $iX)
If $iR <= 70 And $iG <= 70 And $iB <= 70 Then DllStructSetData($tPixel, 1, 0x000000, $iOffset + $iX)
Next
Next
_GDIPlus_BitmapUnlockBits($hClone, $tBits)
_GDIPlus_ImageSaveToFile($hClone, 'images\temp.bmp')
_GDIPlus_ImageDispose($hClone)
_GDIPlus_Shutdown()
EndFunc ;==>_modfile
Собственно сам поиск:
Код:
Func _search ($picture, $x1, $y1, $x2, $y2)
$__g_iBMPFormat = $GDIP_PXF04INDEXED
_GDIPlus_Startup()
$hBitmap = _ScreenCapture_CaptureWnd('', WinGetHandle($Win), $x1, $y1, $x2, $y2)
$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
$iW = _GDIPlus_ImageGetWidth($hImage)
$iH = _GDIPlus_ImageGetHeight($hImage)
$hClone = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iW, $iH, $__g_iBMPFormat)
$tBits = _GDIPlus_BitmapLockBits($hClone, 0, 0, $iW, $iH, BitOR($GDIP_ILMWRITE, $GDIP_ILMREAD))
$iScan0 = DllStructGetData($tBits, "Scan0")
$tPixel = DllStructCreate("int[" & $iW * $iH & "];", $iScan0)
For $iY = 0 To $iH - 1
$iOffset = $iY * $iW + 1
For $iX = 0 To $iW - 1
$iColor = DllStructGetData($tPixel, 1, $iOffset + $iX)
$iR = BitAND(BitShift($iColor, 16), 0xFF)
$iG = BitAND(BitShift($iColor, 8), 0xFF)
$iB = BitAND($iColor, 0xFF)
If $iR > 90 And $iG > 90 And $iB > 90 Then DllStructSetData($tPixel, 1, 0x00FF00, $iOffset + $iX)
If $iR <= 90 And $iG <= 90 And $iB <= 90 Then DllStructSetData($tPixel, 1, 0x000000, $iOffset + $iX)
Next
Next
_GDIPlus_BitmapUnlockBits($hClone, $tBits)
;_GDIPlus_ImageSaveToFile($hClone, "images\temp.bmp")
$hSource = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hClone)
;_GDIPlus_ImageDispose($hClone)
;_GDIPlus_Shutdown()
$hBmp = _GDIPlus_BitmapCreateFromFile($picture)
$hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
$aCoords = _BmpSearch($hSource, $hFind, 5)
If @error Then
ConsoleWrite("Ne naydeno" & @CRLF)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteObject($hFind)
_GDIPlus_Shutdown()
Return SetError(-1)
Else
Local $coord[2]
$coord[0] = $aCoords[1][2] - 1 + $x1
$coord[1] = $aCoords[1][3] - 33 + $y1
ConsoleWrite("X:" & $coord[0] & " Y:" & $coord[1] & " time:" & @extended & @CRLF)
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteObject($hFind)
_GDIPlus_Shutdown()
Return $coord
EndIf
EndFunc
Поиск происходит в области
temp.bmp
файл 1.bmp находит
файл 2.bmp не находит.
Сообщение автоматически объединено:
Как всегда, после описания проблемы, пришло озарение.
Тема закрыта.
Модераторы, удалите тему.
Вложения
Последнее редактирование: