Что нового

Расширение PixelSearch() - добавлена проверка соседних пикселей

arigami67

Новичок
Сообщения
6
Репутация
4
Скрипт проходит по картинке в поиске нужного пикселя. При нахождение, запоминает координаты этого пикселя (абсолютные) и на основе этих координат смотрит соседние точки, являются ли они заданного цвета.

Немного про обычный PixelSearch:
Заходим на http://autoit-script.ru/autoit3_docs/functions/PixelSearch.htm и видим
Направление поиска изменяется в зависимости от того, как указаны границы прямоугольника:
Слева направо - left < right
Справа налево - right < left
Сверху вниз - top < bottom
Снизу вверх - bottom < top
Кто не в теме, сюда Новый крутой PixelSearch :smile:
gps_Pixel_Searc()
Код:
Func gps_Pixel_Searc($gps_x_y, $search_color, $array) ; Ищет точку, но если нашел, то проверяет ближайшие координаты, если там ничего нет, то идет дальше
   ; Проверка направленна только на поиск сверху вниз
   ; $array - двумерный массив проверяемых координат от заданной точки, заданного цвета $array[1][2] = [['X','Y','Color']]
   Local $flag_finish = 0 ; Если равен 1, то мы что - то нашли иначе возрашаем 0
   Local $array_finish[1][2] ; Финальный массив с данными
   Local $flag_line = 0 ; Значит у нас осталось одна линия и мы будем проверять только ее
   Local $Pixel_local[2] ; Запоминаем координаты PixelSearch когда он выдает ошибку

   While 1

	If $flag_finish = 0 Then
		$PixelSearch = PixelSearch( $gps_x_y[0][0], $gps_x_y[0][1], $gps_x_y[0][2], $gps_x_y[0][3], $search_color) ; Ищем первый раз по стандартным значениям
	Else

		 If $PixelSearch[0] = $gps_x_y[0][2] Then ; Значит у нас осталось одна линия
			$flag_line = 1
			MsgBox(0,0,"ПОследняя линия")
			$PixelSearch = PixelSearch( $PixelSearch[0], $PixelSearch[1]+1, $gps_x_y[0][2], $gps_x_y[0][3], $search_color)
			   if  @error = 1 Then
				  return 0
			   EndIf
		 EndIf

			; возможно что он зациклился при $PixelSearch[1]+$flag_line_x, когда выпрыгивает за предел и никто не может вернуть его оттуда

			; Ищем по линии, но кроме нее есть еще блок в который нужно зайти
		 If $PixelSearch[0] <> $gps_x_y[0][2] AND $PixelSearch[1] <> $gps_x_y[0][3] Then ; Если X не равны(То есть есть кроме линии еще и блок) и Y не самый нижний, то значит проходим в самый низ до Y
			$Pixel_local[0] = $PixelSearch[0]
			$Pixel_local[1] = $PixelSearch[1]

			$PixelSearch = PixelSearch( $PixelSearch[0], $PixelSearch[1]+1, $PixelSearch[0], $gps_x_y[0][3], $search_color)

			   If  @error=1 Then
					Dim $PixelSearch[2]
					$PixelSearch[0] = $Pixel_local[0] + 1
					$PixelSearch[1] = $gps_x_y[0][1]
			   EndIf

		 EndIf

			; Ищем по всему блоку, если это уже не новый блок
			If $PixelSearch[1] = $gps_x_y[0][1] Then ; Если самый верхний Y в нашем поиске равен Y в начальных координатах
				$PixelSearch = PixelSearch( $PixelSearch[0], $gps_x_y[0][1], $gps_x_y[0][2], $gps_x_y[0][3], $search_color)
				If  @error = 1 Then
					return 0
				EndIf
			EndIf

	EndIf

	  If  not @error Then
		$flag_finish = 1 ; Если первый раз что - то нашли, то увеличиваем флаг, тем самым даем знать что проверить дальше

		 For $x = 0 To UBound ($array, 1)-1

			$PixelSearch_gps = PixelSearch( $PixelSearch[0]+$array[$x][0], $PixelSearch[1]+$array[$x][1], $PixelSearch[0]+$array[$x][0], $PixelSearch[1]+$array[$x][1], $array[$x][2])

			If  @error=1 Then
				ExitLoop
		   EndIf

			If $x = UBound ($array, 1)-1  Then ; Если мы прошли все проверки, то возращаем массив с координатами
				$array_finish[0][0] = $PixelSearch[0]
				$array_finish[0][1] = $PixelSearch[1]
				return $array_finish
			EndIf
		 Next

	  Else

		If $flag_finish = 0 Then ; Если выполняется это условие, то мы вообще ничего не нашли
			return 0
		EndIf

	  EndIf

   WEnd

EndFunc
Пример
Код:
Dim $array[5][3] = [[1,0,'0x000000'],[2,0,'0x000000'], [0,1,'0xDB903A']] ; Указываем относительно абсолютной координаты. [X,Y,'Цвет']
Dim $gps_x_y[1][4] = [[52,151,169,300]] ; Поиск пока что рассчитан на сверху->вниз, слева->направо
$search_color = '0x000000' ; Цвет абсолютной координаты

$x = gps_Pixel_Searc($gps_x_y, $search_color, $array)
_ArrayDisplay($x)

P.S
1. Если нужен Пример на картинке подробнее, пишите. Просто занят очень.
По моему мнению если особо никому не нужно, то и горбатиться незачем ).
2. Был бы с удовольствием рад выслушать что в моем Говнокоде совсем ужасно ( Я имею виду что - то типа ненужных действий и.т.д.)
 
Верх