Что нового

Подсчет кол-ва пикселей определенного цвета в определенной области активного окн

z3xix13

Новичок
Сообщения
7
Репутация
0
УВ. Формумчане как реализовать то что описано в теме на AutoIt.



Подробнее:

Вот на примере "Pixelsearch" таким образом можно обрабатывать определенную область активного окна независимо от того что активное окно будет менять координаты.(но не размер)

Верхний левый угол обрабатываемой области активного окна находится в координатах x=150 y=150.




Код:
$winpos = WinGetPos("[active]")

$pixelSearch = pixelsearch ($winpos[0]+150,$winpos[1]+150,100,100,0xc0c0c0)

где $winpos[0] и $winpos[1] это координаты верхнего левого угла обрабатываемой области активного окна.А 100,100 - это длина и ширина обрабатываемой области.



Теперь вопрос как мне делать подсчет пикселей [цвета "A"] в определенной области активного окна.

Как делать подсчет пикселей в определенной области активного окна мне ясно, а вот как делать подсчет пикселей определенного цвета мне не ясно.
 

EqKeeper

Новичок
Сообщения
29
Репутация
1
Не знаю кто такой "цвет А", так что с ним ты уж определишься сам.

Код:
; Получаем позицию окна или контрола
$t = WinGetPos("[CLASS:SciTEWindow]")
$top = $t[1] + 200 ; будем искать не с самого верха, чтобы увидеть, что все работает
$bottom = $top + $t[3] - 0
$left = $t[0] + 0
$right = $left + $t[2] - 0

MsgBox(0, "", "Количество найденных пикселей: " &  GetPixelCount(0xF0F4F9, $top, $bottom, $left, $right))
Exit

; Функция возвращает количество пикселей определенного цвета в указанной области
; $color - целое число, представляющее искомый цвет
; $top - верхняя граница области
; $bottom - нижняя граница области
; $left - левая граница области
; $right - правая граница области
Func GetPixelCount($color, $top = 0, $bottom = 0, $left = 0, $right = 0)
        ; Проверка значений входных данных
	If Not $color Then Return False
	$color = Int($color)
	If $top < 0 Then $top = 0
	If $bottom < 1 Then $bottom = @DesktopHeight - 1
	If $left < 0 Then $left = 0
	If $right < 1 Then $right = @DesktopWidth - 1
        $result = 0
        ; Перебираем пиксели в указанной зоне
	For $y = $top to $bottom
		For $x = $left to $right
			$getcolor = PixelGetColor($x, $y)
			If ($getcolor == $color) Then
				$result = $result + 1
			EndIf
			ToolTip($x & "," & $y & ": " & $getcolor & " (" & $result & ")")
		Next
	Next
	Return $result ; возвращаем полученное количество пикселей
EndFunc
Вот такой вот код посчитает все пиксели фона в окне SciTE. Способ приметивный, медленный (тултип естественно лишний и тормозит работу, но и без него будет не быстро).
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
У PixelSearch - третий и четвертый параметры - это не длинна и ширина а x2, y2 области поиска. Чтобы не получать каждый раз в переменную х и у левого верхнего угла активного окна, используй опцию:
Код:
Opt("PixelCoordMode", 2) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна


Чтобы сделать продолжение поиска можно использовать этот алгоритм: http://autoit-script.ru/index.php/topic,182.0.html
Тебе его придется правда переписать под свои задачи.
Суть алгоритма: Получаем координаты области поиска и искомый цвет. Начинаем поиск, найдя пиксель с нужным цветом добавляем к счетчику +1. Переопределяем область поиска на два новых поля. Первое поле - обрабатывает оставшуюся плоскость в 1 пиксель до края старой области поиска, другая область обрабатывает оставшееся от старой области место, то есть координаты двух новых областей поиска у тебя будут такие:

Изначальная область поиска:
150, 150, 250, 250
например в координатах 189, 220 был найден нужный цвет
новая область поиска 1: 189, 220, 250, 220 ;обрабатываем оставшееся от старой области пространство в текущей строке
новая область поиска 2: 150, 220, 250, 250 ;обрабатываем все оставшееся от старой области поиска пространство.


Ну или можешь загнать PixelSearch в два For...Next цикла и обработать этой командой каждый пиксель отдельно.



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

Использование PixelGetColor не самая лучшая идея, он не учитывает оттенки без дополнительного шоманства.
 
Верх