Что нового

Быстрый вариант PixelGetColor. Как настроить _PixelGetColor_CaptureRegion?

QQruza

Новичок
Сообщения
26
Репутация
0
Искал чем заменить медленный PixelGetColor, нашел код пример

Код:
#include <_PixelGetColor.au3>
#include <Misc.au3>

$hDll = DllOpen("gdi32.dll")

$vDC = _PixelGetColor_CreateDC($hDll)

$vRegion = _PixelGetColor_CaptureRegion($vDC, 0,0,@DesktopWidth,@DesktopHeight,$hDll)

; click left mouse button to exit
While Not _IsPressed(0x01)
    $aPos = MouseGetPos()
    $sColor = _PixelGetColor_GetPixel($vDC, $aPos[0],$aPos[1], $hDll)

    ToolTip("The color under your mouse is: " & $sColor, $aPos[0]+3, $aPos[1]+3, "_PixelGetColor_GetPixel return",$hDll)
WEnd

_PixelGetColor_ReleaseRegion($vRegion)

_PixelGetColor_ReleaseDC($vDC,$hDll)

DllClose($hDll)


Вопрос по этой строчке
Код:
$vRegion = _PixelGetColor_CaptureRegion($vDC, 0,0,@DesktopWidth,@DesktopHeight,$hDll)


Как я понимаю
Код:
$vRegion = _PixelGetColor_CaptureRegion($vDC, Левый край области,Верхний край области,Правый край области,Нижний край области,$hDll)


И какую бы область я не задавал работает только от левого верхнего угла экрана, что я делаю не так?

_PixelGetColor.au3 прикрепил
 

Findoss

Знающий
Сообщения
9
Репутация
7
Я не знаю чего там медленно , у меня всё :ok:
А параметр области задается двумя точками
X1Y1

X2Y2

Код:
$vRegion = _PixelGetColor_CaptureRegion($vDC, X1 ,Y1 ,X2 ,Y2 ,$hDll)


Я бы сделал проще :-\
Код:
#include <Misc.au3>

While Not _IsPressed(0x01)
$aPos = MouseGetPos();получаем координаты мыши
$sColor= PixelGetColor($aPos[0], $aPos[1]) ; получаем цвет
;выводим в десятичном и шестнадцатеричном виде
ToolTip("Цвет Dec: " & $sColor &@CR&"          Hex: "&Hex($sColor), $aPos[0]+5, $aPos[1]+5) 
WEnd


P.S. Для поиска нужного цвета в области , можно использовать PixelSearch(Ex) .
 
Автор
Q

QQruza

Новичок
Сообщения
26
Репутация
0
Вы называете "Отлично" различие в скорости более чем в 100 раз? :smile:

Код:
#include <_PixelGetColor.au3>

Dim $testMaxX = 10
Dim $testMaxY = 10

ConsoleWrite("Starting test in field (0,0) to (" & $testMaxX & "," & $testMaxY & ")" & @CRLF)

ToolTip(1)

$hDll = DllOpen("gdi32.dll")
$vDC = _PixelGetColor_CreateDC($hDll)

ToolTip(2)

$a = TimerInit()
CaptureNative($testMaxX, $testMaxY)
$a1 = TimerDiff($a)

ToolTip(3)

$b = TimerInit()
CaptureUDF($testMaxX, $testMaxY)
$b1 = TimerDiff($b)

ToolTip(4)

_PixelGetColor_ReleaseDC($vDC,$hDll)
DllClose($hDll)

ToolTip(5)

ConsoleWrite("Native: " & $a1 & @CRLF)
ConsoleWrite("UDF   : " & $b1 & @CRLF)

Func CaptureNative($xmax, $ymax)
	For $x = 0 to $xmax
		For $y = 0 to $ymax
			ToolTip($x & "," & $y)
			PixelGetColor($x, $y)
		Next
	Next
EndFunc

Func CaptureUDF($xmax, $ymax)
	$vRegion = _PixelGetColor_CaptureRegion($vDC, 0,0,$xmax,$ymax,$hDll)
	For $x = 0 to $xmax
		For $y = 0 to $ymax
			_PixelGetColor_GetPixelRaw($vDC, $x, $y, $hDll)
		Next
	Next
	_PixelGetColor_ReleaseRegion($vRegion)
EndFunc


Native: 3981.79481743273
UDF : 36.7384331704015

Findoss, спасибо за ответ, у Вас приведенный мной скрипт без багов откликается на изменение этой области?
 

Findoss

Знающий
Сообщения
9
Репутация
7
Ну начнем что понятие "быстро" "медленно" относительные так как AutoIt уступает как и остальные языки в скорости Фортрану.
Вот одна из последних тем http://autoit-script.ru/index.php/topic,11554.0/topicseen.html :IL_AutoIt_1:

Все зависит для чего использовать, для тех целей что в примере , вполне достаточно .
PS У меня такие результаты
Код:
Native: 44.54215716873
UDF   : 3.93568312040
WinAPIEx: 3.553734374937 (Код ниже)

Может это решит задачу ? :scratch:
Код:
#Include <WinAPIEx.au3>

Global $hDC
Dim $testMaxX = 10
Dim $testMaxY = 10

ConsoleWrite("Starting test in field (0,0) to (" & $testMaxX & "," & $testMaxY & ")" & @CRLF)

$a = TimerInit()
CaptureWinAPIEx($testMaxX, $testMaxY)
$a1 = TimerDiff($a)

ConsoleWrite("WinAPIEx: " & $a1 & @CRLF)

Func CaptureWinAPIEx ($xmax, $ymax)
    For $x = 0 to $xmax
        For $y = 0 to $ymax
		    _WinAPI_GetPixel ( $hDC, $x, $y )
        Next
    Next
 EndFunc
 
Автор
Q

QQruza

Новичок
Сообщения
26
Репутация
0
Только это мне помогло действительно увидеть цвет пикселя в твоем коде
Код:
$hDC = _WinAPI_GetDC(0)


Да, и сразу из этого
Код:
WinAPIEx: 2.98989278140101

получилось это
Код:
WinAPIEx: 2218.69851649709

К вопросу о вопросе темы, код который я запостил у всех работает нормально при изменении области или у меня одного глючит?
 
Верх