Что нового

[Автоматизация] Поиск полосы пикселей по вертикали

gloss

Ленивое кодило
Сообщения
155
Репутация
5
Задача: одновременно найти 3 и более пикселей одного цвета по вертикали, от центра экрана вверх.
С PixelSearch это не работает, какие бы размеры не задавал ничего не выходит. Размер экрана 1920х1080, есть ли какая то UDF на замену?
aI1ojTyL9kA.jpg
 

ArtInt

Знающий
Сообщения
135
Репутация
18
из справки сказал(а):
Контрольная сумма позволяет узнать, "изменилось" ли что-нибудь в указанном регионе - она не может дать однозначный ответ о том, что именно изменилось.
Если с помощью этой функции всё же можно реализовать требуемое, прошу, Garrett или ТС, выложите код. Интересно.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
ArtInt [?]
Если с помощью этой функции всё же можно реализовать требуемое, прошу, Garrett
Запустите скрипт и нажмите пробел.
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

;Opt('MouseCoordMode', 2)
Opt('PixelCoordMode', 2)

AdlibRegister('_PixelChecksum')

HotKeySet('{SPACE}', '_ChangeColor')

$i = 0
$i_Top = 118
$i_Left = 230
$i_Width = $i_Left + 5
$i_Height = $i_Top + 7
$pChecksum = DllStructCreate('double[2]')
$dColor = 4210053115 ; Read 4210053115; PixelChecksum mode CRC32 
;$dColor = 2243688972 ; Green 2243688972; PixelChecksum mode CRC32

$Form1 = GUICreate("Checksum", 623, 449, -1, -1)
GUISetBkColor(0xFFFFFF)
$Label1 = GUICtrlCreateLabel("", 232, 120, 1, 3)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
	Case $GUI_EVENT_CLOSE
			AdlibUnRegister('_PixelChecksum')
			Exit

	EndSwitch
WEnd

Func _PixelChecksum()
	
	$i_Checksum = PixelChecksum($i_Left, $i_Top, $i_Width, $i_Height, 1, $Form1, 1)
	;ConsoleWrite(StringFormat('%s\n', $i_Checksum))
	DllStructSetData($pChecksum, 1, $i_Checksum, 1)
	DllStructSetData($pChecksum, 1, $dColor, 2)
	
	If DllStructGetData($pChecksum, 1, 1) = DllStructGetData($pChecksum, 1, 2) Then
		MsgBox(64, @ScriptName, 'Произошло изменение!')
		GUICtrlSetBkColor($Label1, 0xFFFFFF)
		$i = Not $i
	EndIf
EndFunc;==>_PixelChecksum

Func _ChangeColor()
	
	If Not $i Then
		$i = Not $i
		GUICtrlSetBkColor($Label1, 0xFF0000) ; Red
		;GUICtrlSetBkColor($Label1, 0x00FF00) ; Green
	Else
		$i = Not $i
		GUICtrlSetBkColor($Label1, 0xFFFFFF)
	EndIf
EndFunc;==>_ChangeColor
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett [?]
Запустите скрипт и нажмите пробел.
Так, вроде, чуть проще. :smile:
Код:
#include <GUIConstantsEx.au3>

;~ Opt('MouseCoordMode', 2)
Opt('PixelCoordMode', 2)

HotKeySet('{SPACE}', '_ChangeColor')

Global $iIndexColor, $i_Top = 118, $i_Left = 230, $i_Width = $i_Left + 5, $i_Height = $i_Top + 7, $iColor = 2363171831, $hGui, $iLbl, $iCountChange

$hGui = GUICreate('Checksum', 623, 449)
GUISetBkColor(0xFFFFFF)
$iLbl = GUICtrlCreateLabel('', 232, 120, 3, 3)
GUICtrlSetBkColor(-1, 0xFF0000)
GUISetState()
AdlibRegister('_Run_PixelChecksum')

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

AdlibUnRegister('_PixelChecksum')
Exit

Func _PixelChecksum()
	Local $i_Checksum = PixelChecksum($i_Left, $i_Top, $i_Width, $i_Height, 1, $hGui, 1)
;~ 	ConsoleWrite($i_Checksum & @LF)
	If $iColor <> $i_Checksum Then
		$iColor = $i_Checksum
		$iCountChange += 1
		ConsoleWrite($iCountChange & ' Произошло изменение!' & @LF)
	EndIf
EndFunc   ;==>_PixelChecksum

Func _ChangeColor()
	Local $a_Color[2] = [0xFF0000, 0x000000]
	$iIndexColor = Not $iIndexColor
	GUICtrlSetBkColor($iLbl, $a_Color[$iIndexColor])
EndFunc   ;==>_ChangeColor

Func _Run_PixelChecksum()
	ConsoleWrite('You can press {SPACE}' & @LF)
	AdlibUnRegister('_Run_PixelChecksum')
	AdlibRegister('_PixelChecksum')
EndFunc   ;==>_Run_PixelChecksum
Или так, но только для своего окна.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

;~ Opt('MouseCoordMode', 2)
Opt('PixelCoordMode', 2)

HotKeySet('{SPACE}', '_ChangeColor')

Global $iIndexColor, $i_Top = 118, $i_Left = 230, $i_Width = $i_Left + 5, $i_Height = $i_Top + 7, $iColor, $hGui, $iLbl, $iCountChange

$hGui = GUICreate('Checksum', 623, 449)
GUISetBkColor(0xFFFFFF)
$iLbl = GUICtrlCreateLabel('', 232, 120, 3, 3)
GUICtrlSetBkColor(-1, 0xFF0000)
GUISetState()
GUIRegisterMsg($WM_PAINT, "_WM_PAINT")
ConsoleWrite('Can press {SPACE}' & @LF)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Exit

Func _PixelChecksum()
	Local $i_Checksum = PixelChecksum($i_Left, $i_Top, $i_Width, $i_Height, 1, $hGui, 1)
;~ 	ConsoleWrite($i_Checksum & @LF)
	If $iColor <> $i_Checksum Then
		$iColor = $i_Checksum
		$iCountChange += 1
		ConsoleWrite($iCountChange & ' Произошло изменение!' & @LF)
	EndIf
EndFunc   ;==>_PixelChecksum

Func _ChangeColor()
	Local $a_Color[2] = [0xFF0000, 0x000000]
	$iIndexColor = Not $iIndexColor
	GUICtrlSetBkColor($iLbl, $a_Color[$iIndexColor])
EndFunc   ;==>_ChangeColor

Func _WM_PAINT($hWnd, $Msg, $wParam, $lParam)
	_PixelChecksum()
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_PAINT
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
Можно и так. :smile:
Главное - понять принцип.

P.S. Структура. Я посчитал что, строго привести переменные к одному типу будет грамотнее. Ну, это так, к слову.
 
Верх