Автор Тема: Быстрый вариант PixelGetColor. Как настроить _PixelGetColor_CaptureRegion?  (Прочитано 4791 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн QQruza [?]

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

Код: AutoIt [Выделить]
#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)


Вопрос по этой строчке
Код: AutoIt [Выделить]
$vRegion = _PixelGetColor_CaptureRegion($vDC, 0,0,@DesktopWidth,@DesktopHeight,$hDll)


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


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

_PixelGetColor.au3 прикрепил
« Последнее редактирование: Октябрь 15, 2012, 04:50:04 от QQruza »

Русское сообщество AutoIt


Оффлайн Findoss [?]

  • Новичок
  • *
  • Сообщений: 9
  • Репутация: 7
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Я не знаю чего там медленно , у меня всё :ok:
А параметр области задается  двумя точками
X1Y1     
     
         
       X2Y2

Код: AutoIt [Выделить]
$vRegion = _PixelGetColor_CaptureRegion($vDC, X1 ,Y1 ,X2 ,Y2 ,$hDll)


Я бы сделал проще  :-\
Код: AutoIt [Выделить]
#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) .
« Последнее редактирование: Октябрь 11, 2012, 18:40:55 от Findoss »
Это невозможно - сказала Причина.
Это безрассудно - заметил Опыт.
Это безполезно - отрезала Гордость.
Попоробуй... - шепнула Мечта... (с)

Оффлайн QQruza [?]

  • Новичок
  • *
  • Сообщений: 18

  • Автор темы
  • Репутация: 0
    • Награды
Вы называете "Отлично" различие в скорости более чем в 100 раз?  :)

Код: AutoIt [Выделить]
#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, спасибо за ответ, у Вас приведенный мной скрипт без багов откликается на изменение этой области?
« Последнее редактирование: Октябрь 12, 2012, 00:21:50 от QQruza »

Русское сообщество AutoIt

Re: Быстрый вариант PixelGetColor. Как настроить _PixelGetColor_CaptureRegion?
« Ответ #2 Отправлен: Октябрь 11, 2012, 21:16:05 »

Оффлайн Findoss [?]

  • Новичок
  • *
  • Сообщений: 9
  • Репутация: 7
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Ну начнем что понятие "быстро" "медленно" относительные так как 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 (Код ниже)

Может это решит задачу ?  :think:
Код: AutoIt [Выделить]
#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
 


Оффлайн QQruza [?]

  • Новичок
  • *
  • Сообщений: 18

  • Автор темы
  • Репутация: 0
    • Награды
Только это мне помогло действительно увидеть цвет пикселя в твоем коде
Код: AutoIt [Выделить]
$hDC = _WinAPI_GetDC(0)


Да, и сразу из этого
WinAPIEx: 2.98989278140101
получилось это
WinAPIEx: 2218.69851649709
К вопросу о вопросе темы, код который я запостил у всех работает нормально при изменении области или у меня одного глючит?
« Последнее редактирование: Октябрь 15, 2012, 10:24:17 от QQruza »

Русское сообщество AutoIt

Re: Быстрый вариант PixelGetColor. Как настроить _PixelGetColor_CaptureRegion?
« Ответ #4 Отправлен: Октябрь 15, 2012, 04:46:56 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
3227 Просмотров
Последний ответ Май 04, 2013, 23:22:21
от AZJIO
41 Ответов
13092 Просмотров
Последний ответ Октябрь 10, 2013, 23:40:18
от Jan-Jak
0 Ответов
1222 Просмотров
Последний ответ Июль 23, 2013, 16:15:58
от madmasles
2 Ответов
2207 Просмотров
Последний ответ Сентябрь 19, 2013, 15:59:20
от CreatoR
2 Ответов
1068 Просмотров
Последний ответ Июнь 06, 2015, 19:36:24
от Tapok
3 Ответов
1347 Просмотров
Последний ответ Декабрь 02, 2015, 21:05:23
от Prog
6 Ответов
1555 Просмотров
Последний ответ Май 10, 2016, 02:18:44
от Alofa
2 Ответов
1086 Просмотров
Последний ответ Сентябрь 30, 2016, 13:54:41
от mef-t
1 Ответов
503 Просмотров
Последний ответ Октябрь 19, 2017, 10:15:19
от hedji
4 Ответов
2495 Просмотров
Последний ответ Октябрь 14, 2018, 01:53:23
от vaf