Что нового

Как сделать "перечисление" пикселей?

masheen

Новичок
Сообщения
25
Репутация
0
Как найти последний пиксель на линии например как на картинке
Как мне начать поиск и получить в итоге координат последнего пикселя в точке Б
Bezymyanny.jpg


Я пытаюсь сделать это таким образом что я делаю не правильно?
Код:
$EnumLine = $LineMiddle[0]
while Not @error
$TargetHorisontalLine=PixelSearch($EnumLine, $LineMiddle[1]-1, $LineMiddle[1]-1, $AlpariWinPos[3], 0x008000)
$EnumLine +=8
WEnd
MsgBox(0, "Координаты","Координаты: "& $TargetHorisontalLine[0] & 'x' & $TargetHorisontalLine[1])


если каждый шаг проверять то он находит все эти пиксели показывает последний пиксель и выдает ошибку:

Код:
==> Subscript used on non-accessible variable.:
MsgBox(0, "________","________: "& $TargetHorisontalLine[0] & 'x' & $TargetHorisontalLine[1])
MsgBox(0, "________","________: "& $TargetHorisontalLine^ ERROR
>Exit code: 1    Time: 1.244
 
Автор
M

masheen

Новичок
Сообщения
25
Репутация
0
Re: Помогите новичку

Хм проблемму решил сделав следующее
Код:
$yt = 0
$yu = 0
while Not @error
$TargetHorisontalLine=PixelSearch($EnumLine, $LineMiddle[1]-1, $LineMiddle[1]-1, $AlpariWinPos[3], 0x008000)
If Not @error Then
$EnumLine +=8
$yt=$TargetHorisontalLine[0]
$yu=$TargetHorisontalLine[1]
EndIf
WEnd
MsgBox(0, "Координаты","Координаты: "& $yt & 'x' & $yu)


Но мне кажеся что есть способ легче и короче, подскажите кто знает
 

weweWe45s

Новичок
Сообщения
36
Репутация
1
Re: Помогите новичку

попробуйте пользоваться bbc кодами )

[hide]
Код:
$yt = 0
$yu = 0
while Not @error
    $TargetHorisontalLine=PixelSearch($EnumLine, $LineMiddle[1]-1, $LineMiddle[1]-1, $AlpariWinPos[3], 0x008000)
    If Not @error Then
         $EnumLine +=8
         $yt=$TargetHorisontalLine[0]
         $yu=$TargetHorisontalLine[1]
    EndIf
WEnd
MsgBox(0, "Координаты","Координаты: "& $yt & 'x' & $yu)
[/hide]

для кода приводимого в сообщении )
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: Помогите новичку

masheen

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Помогите новичку" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Глобальный модератор.
 

weweWe45s

Новичок
Сообщения
36
Репутация
1
вы пытаетесь найти собственно что ? ... эээ найти координаты
последнего определенного цвета пикселя (0x008000) находящийся в определенной области
ведя (начиная) отсчет по оси х (с шагом кратным восьми) и когда она (линия)
заканчивается переходить на следующию линию (находящуюся ниже) по оси y
пока не будет проверенна вся указанная область
так?
пример
xzkoarqodphxjdtq.png

а не проще ли начинать отсчет не с нуля а с максимума
 
A

Alofa

Гость
masheen а картинка-то где?
Ничего не понятно из описания...
... Или это что, попытка увеличить скорость обнаружения пикселей?
Почитайте тогда Здесь, Здесь и Здесь.

И еще, внимательно почитайте описание функции "PixelSearch()":
Примечания
Направление поиска изменяется в зависимости от того, как указаны границы прямоугольника:
Слева направо - left < right
Справа налево - right < left
Сверху вниз - top < bottom
Снизу вверх - bottom < top
Изменение направления поиска может быть полезно в том случае, если цвет, который нужно найти, чаще появляется в определённой части области для поиска, поскольку в этом случае функция будет быстрее находить искомый пиксель.
 
Автор
M

masheen

Новичок
Сообщения
25
Репутация
0
weweWe45s сказал(а):
вы пытаетесь найти собственно что ? ... эээ найти координаты
последнего определенного цвета пикселя (0x008000) находящийся в определенной области
ведя (начиная) отсчет по оси х (с шагом кратным восьми) и когда она (линия)
заканчивается переходить на следующию линию (находящуюся ниже) по оси y
пока не будет проверенна вся указанная область
так?
пример
ClluVeO7LB4.jpg

а не проще ли начинать отсчет не с нуля а с максимума

Привет, да почти правильно. Сразу отвечу с конца не проще нужно именно сначала. И не нужно переходить на следующую строчку.

Скрин примерно того что нужно сделать
ClluVeO7LB4.jpg


Нужно чтобы слево направо он нашел последнюю зеленую линию, точнее ее координаты размер поиска 1 пиксель в ширину
расстояние между полосами 8 пикселей поэтому шаг 8.

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

weweWe45s

Новичок
Сообщения
36
Репутация
1
ну ежели так то ихмо любой код правильный если он работает )
 
A

Alofa

Гость
Еще 2 варианта:
Код:
#include <Timers.au3>
#include <WindowsConstants.au3>
;____________________________________________________________________________________________
$hGui = GUICreate('', 1299, 62, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_CONTROLPARENT))
GUICtrlCreatePic(@ScriptDir & '\image.gif', 0, 0, 1299, 62)
GUISetState()
;____________________________________________________________________________________________

$iLeft = 10 ; Координата x левой стороны прямоугольника
$iTop = 11 ; Координата y верхней стороны прямоугольника
$iRight = 1289 ; Координата x правой стороны прямоугольника.
$iBottom = 12 ; Координата y нижней стороны прямоугольника.
$iColor = 0x9BE600 ; Цвет пикселя для поиска
$iInterval = 8 ; Интервал между полосками
$iCoord_X = 0 ; Искомая координата X
$iCoord_Y = 0 ; Искомая координата Y

Local $TextVar2, $iTimer1, $iTimer2, $hTimer = _Timer_Init() ; Запускаем таймер

; Вариант №1 (поиск слева направо - сверху вниз):
For $i = $iLeft To $iRight Step $iInterval
    $TargetHorisontalLine = PixelSearch($i, $iTop, $iRight, $iBottom, $iColor)
    If Not @error Then
        $iCoord_X = $TargetHorisontalLine[0]
        $iCoord_Y = $TargetHorisontalLine[1]
    Else
        ExitLoop
    EndIf
Next
$iTimer1 = Round(_Timer_Diff($hTimer), 5)

; Вариант №2 (поиск справа налево - сверху вниз):
$TargetHorisontalLine = PixelSearch($iRight, $iTop, $iLeft, $iBottom, $iColor)
$iTimer2 = @error ? 'Oops' : Round(_Timer_Diff($hTimer) - $iTimer1, 5)
If Not @error Then $TextVar2 = @LF &@LF &'Вариант №2:' & @LF & 'Координаты: ' & $TargetHorisontalLine[0] & ' x ' & $TargetHorisontalLine[1] & @LF & 'Время: ' & $iTimer2

MsgBox(64, '', 'Вариант №1:' & @LF & 'Координаты: ' & $iCoord_X & ' x ' & $iCoord_Y & @LF & 'Время: ' & $iTimer1 & $TextVar2)

Для картинки во вложениях.
 

Вложения

  • image.gif
    image.gif
    1.6 КБ · Просмотры: 4
Верх