Что нового

ImgPixelSearch - Поиск картинки(файла) на экране с использованием PixelSearch

Ilyialat

Новичок
Сообщения
54
Репутация
2
Сделал новую функцию - ImgPixelSearch =)
Она работает аналогично ImageSearch.dll
Открывает изображение и ищет их на экране =)
Результаты не обрадовали
di-ZLVU.jpg
di-55K6.jpg
2-ой тест лучше =)
di-U4R3.jpg
di-Y4G3.jpg

Это всё из-за того, что моя фунция юзает PixelGetColor...
Зато она поддерживает прозрачность и более адекватная =)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: ImageSearch vs ImgPixelSearch

Изображения сунь под спойлеры


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

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"ImageSearch vs ImgPixelSearch" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.











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

И чем тебя не устроил PixelSearchEx? С его помощью можно прекрасно искать по заданным пресетам интересующие изображения.
 
Автор
I

Ilyialat

Новичок
Сообщения
54
Репутация
2
ImgPixelSearch

Код:
Func ImgPixelSearch($bmp, ByRef $rx, ByRef $ry, $x = 0, $y = 0, $x1 = @DesktopWidth, $y1 = @DesktopHeight)
FileChangeDir ($img_dir)
;Viktor1703 kod_start
Local $hImage, $iWidth, $iHeight, $iBitmap, $hBitmap
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($bmp)
$iWidth = _GDIPlus_ImageGetWidth($hImage)
$iHeight = _GDIPlus_ImageGetHeight($hImage)
$iBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($iBitmap)
Dim $iMatrix[$iHeight][$iWidth]
For $H = 0 To $iHeight - 1
	For $W = 0 To $iWidth - 1
		$iMatrix[$H][$W] = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $W, $H), 6)
	Next
Next
_GDIPlus_ImageDispose($hImage)
_WinAPI_DeleteObject($iBitmap)
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_Shutdown()
;Viktor1703 kod_end

Dim $lx, $ly, $i, $i1, $img_x, $imh_y
$i = 0
$i1 = 0
For $img_x = $i To $iWidth
For $img_y = $i1 To $iHeight
	If $iMatrix[$img_x][$img_y] <> 0x040404 Then ExitLoop(2) ;мы должны найти непрозрачный пиксель 
Next
Next
$lx = $x
$ly = $y
While 1 == 1
	$px = PixelSearch($lx + 1, $ly + 1, $x1, $y1, $iMatrix[$img_x][$img_y]) ;ищем его
    If Not @error Then ;если нашли, то запоминаем его координаты(зелёный прямоугольник)
		$lx = $px[0]
		$ly = $px[1]
        For $i = $img_x To $iHeight - 1 ;начинаем с места, где нет прозрачности
        For $i1 = $img_y To $iWidth - 1
			If $iMatrix[$i][$i1] == 0x040404 Then ContinueLoop ;Проверка на прозрачность
			If PixelGetColor($lx + $i1, $ly + $i) <> $iMatrix[$i][$i1] Then ExitLoop(2) ;Если хоть 1 пиксель отличается - прерываем цикл
			If ($i1 == $iWidth - 1)And($i == $iHeight - 1) Then ;Если все пиксели совпадают, то мы нашли картинку
				$rx = $lx
				$ry = $ly
				return 1
			EndIf
		Next
	    Next
	Else ;Если мы просканировали весь экран и ничего не нашли. возвращаем 0
		return 0
	EndIf
WEnd
Мне легче работать с картинками
Есть 1 нерешённая проблема...
di-3ZCY.jpg
Функция достигнет препятствия(зеленый прямоугольник), и дальше будет искать в зоне, ограждённой красными линиями... Пока что ничего не придумал...
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: ImgPixelSearch

Правила почитай как темы называть надо. Просто название функции на английском - это не название темы.

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"ImgPixelSearch" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.
 
Автор
I

Ilyialat

Новичок
Сообщения
54
Репутация
2
Что за FastFind?)


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

Интересно... По крайней мере dll явно быстрее автоита...


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

Только как её сюда пристроить?
 
Автор
I

Ilyialat

Новичок
Сообщения
54
Репутация
2
Код:
Func ImgPixelSearch($bmp, ByRef $rx, ByRef $ry, $x = 0, $y = 0, $x1 = @DesktopWidth, $y1 = @DesktopHeight);Viktor1703 kod_start
Local $hImage, $iWidth, $iHeight, $iBitmap, $hBitmap
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile($bmp)
$iWidth = _GDIPlus_ImageGetWidth($hImage)
$iHeight = _GDIPlus_ImageGetHeight($hImage)
$iBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($iBitmap)
Dim $iMatrix[$iHeight][$iWidth]
For $H = 0 To $iHeight - 1
    For $W = 0 To $iWidth - 1
        $iMatrix[$H][$W] = '0x' & Hex(_GDIPlus_BitmapGetPixel($hBitmap, $W, $H), 6)
    Next
Next
_GDIPlus_ImageDispose($hImage)
_WinAPI_DeleteObject($iBitmap)
_WinAPI_DeleteObject($hBitmap)
_GDIPlus_Shutdown()
;Viktor1703 kod_end
;_ArrayDisplay($imatrix)

Dim $lx, $ly, $i, $i1, $img_x, $imh_y
For $img_x = 0 To $iWidth
For $img_y = 0 To $iHeight
    If $iMatrix[$img_x][$img_y] <> 0xFFFFFF Then ExitLoop(2) ;мы должны найти непрозрачный пиксель 
Next
Next

Local $px
FFSnapShot()
$px = FFNearestPixel(50, 20, $iMatrix[$img_x][$img_y], False, $x, $y, $x1, $y1) ;ищем его cтроку
While Not @error
$px = FFNearestPixel(50, 20, $iMatrix[$img_x][$img_y], False, $x, $y, $x1, $y1) ;ищем его cтроку
If IsArray($px) Then
	For $i = $img_x To $iHeight - 1 ;начинаем с места, где нет прозрачности
	For $i1 = $img_y To $iWidth - 1
		If FFGetPixel($i, $i1) == 0xFFFFFF Then ContinueLoop ;Проверка на прозрачность
		If FFGetPixel($px[0] + $i1, $px[1] + $i) <> $iMatrix[$i][$i1] Then ExitLoop(2) ;Если хоть 1 пиксель отличается - прерываем цикл
		If ($i1 == $iWidth - 1)And($i == $iHeight - 1) Then ;Если все пиксели совпадают, то мы нашли картинку
			$rx = $px[0]
			$ry = $px[1]
			FFResetExcludedAreas()
			return 1
		EndIf
	Next
	Next
	FFAddExcludedArea($px[0], $px[1], $px[0], $px[1])
Else
	ExitLoop(1)
EndIf
WEnd

    FFResetExcludedAreas()
	return 0
EndFunc
Что-то близкое... Но с прозрачностью не работает)
 
Верх