Что нового

PixelSearch и работа с ней.

Arei

Скриптер
Сообщения
938
Репутация
115
Скажите как мне посчитать количество пиксилей и их цвета в определённом размере экрана.И скажите сколько требуется времени для обработки 50 на 50 изображения.
 

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Количество пикселей в квадрате 50*50 всегда =2500
У меня есть вариант, но он фиговый...
PixelGetColor ( x , y )
Итак 2500 раз(((=
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
спасибо, за информацию новую, но вот как мне отслеживать изменение пикселей цвета


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

Скажите а можно пиксили как то рисовать?


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

Вот так можно их считать, но куда их можно записывать в массив?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
Код:
Dim $Pix[50][50]
For $y = 0 to 49 step 1
    For $x = 0 to 49 step 1
        $Pix[$x][$y] = PixelGetColor($x, $y)
    next
next
For $y = 0 to 49 step 1
    For $x = 0 to 49 step 1
        MsgBox(0,0,"Цвет пикселя по координатам x:"&$x&" $y:"&$y&" = 0x"&hex($Pix[$x][$y], 6))
    next
next

Могут быть ошибки, писал прямо в браузере
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Написал код Belfigor чуть-чуть по-своему:

Код:
Dim $Pix[50][50], $Pix_Memory[50][50]

While 1
	For $y = 0 To 49
		For $x = 0 To 49
			$Pix[$x][$y] = PixelGetColor($x, $y)
			If $Pix[$x][$y] <> $Pix_Memory[$x][$y] Then
				If $Pix_Memory[$x][$y] = True Then
					MsgBox(0, "", "Цвет пикселя $Pix[" & $x & "][" & $y &"] изменен.")
				EndIf
				$Pix_Memory[$x][$y] = $Pix[$x][$y]
			EndIf
		Next
	Next
	Sleep(100)
WEnd
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Kalisnik спасибо, но как мне такое сделать мне посоветовали так сделать ""задать погрешность оттенка при котором цвет уже не считается тем который был изначально и проверять их. Если камера не слишком плохая и картинка не рябит думаю взлетит. Для ускорения работы можно брать шаг побольше. Для начала я бы вообще выбрал 4 точки на экране, взял с них данные о пикселях и поставил мониторить скрипт на их изменение. Как только изменение зафиксировано двинуть мышь туда.""


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

Подскажите уважаемый?
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Код:
Dim $PixXY[4][2], $Pix[4], $Pix_Memory[4], $Diapozon

$PixXY[0][0] = 23 ;Координаты первого пикселя по оси Х (устанавливаете в ручную).
$PixXY[0][1] = 15 ;Координаты первого пикселя по оси Y.

$PixXY[1][0] = 35 ;Координаты второго пикселя по оси Х (устанавливаете в ручную).
$PixXY[1][1] = 20 ;По оси Y и т.д.

$PixXY[2][0] = 45 
$PixXY[2][1] = 30 

$PixXY[3][0] = 55 
$PixXY[3][1] = 40

$Diapozon = 1000 ;Величина погрешности, в обе стороны от начального значения, на которую код не будет реагировать (с этим параметром поиграйтесь).

;Выход из скрипта через комбинацию клавиш ALT + Ё.
HotKeySet("!ё", "_Exit")
HotKeySet("!`", "_Exit")

While 1
	For $i = 0 To 3
		$Pix[$i] = PixelGetColor($PixXY[$i][0], $PixXY[$i][1])
		If $Pix_Memory[$i] = False Then
			$Pix_Memory[$i] = $Pix[$i]
		ElseIf $Pix_Memory[$i] - $Diapozon > $Pix[$i] Or $Pix_Memory[$i] + $Diapozon < $Pix[$i] Then
			$Pix_Memory[$i] = $Pix[$i] ;Запоминание изменения - если не нужно, то эту строчку закомментировать.
			MouseMove($PixXY[$i][0], $PixXY[$i][1])
		EndIf
	Next
    Sleep(100)
WEnd

Func _Exit()
    Exit
EndFunc


Работоспособность не проверял.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Спасибо, как раз то что нужно, но проблемма в том что я работаю с видео, и даже если ничего не происходит, то цвета меняются, как мне задать, оттенки, а то он реагирует без повода.Заранее спасибо.
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Arei [?]
Спасибо, как раз то что нужно, но проблемма в том что я работаю с видео, и даже если ничего не происходит, то цвета меняются, как мне задать, оттенки, а то он реагирует без повода.Заранее спасибо.
Попробуйте выставить вот такую величину для переменной $Diapozon = 1000000. Чем больше величина этой переменной, тем код меньше будет реагировать на изменения пикселов и обратно.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Да это помогло, но скажите как можно скрипт более лучше сделать что бы он отслеживал изменение пикселей не всех (а если изменили своё положение больше 50 %)/
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Arei [?]
Да это помогло, но скажите как можно скрипт более лучше сделать что бы он отслеживал изменение пикселей не всех (а если изменили своё положение больше 50 %)/
Не вполне понял вопрос. Причем здесь положение пикселей? - оно задается координатами. Если Вам нужно не отслеживать цвета пикселей зарание определнного положения, а находить оные по некоторому диапозону цветов, то скрипт будет вовсе иным. Если Вам нужно добится реакции скрипта на изменение цвета пикселя в более чем 50% его оттенка, то увеличивайте параметр $Diapozon и будет Вам хоть 100%. Если бы Вы объяснили зачем это все нужно, то можно было бы и подумать как улучишить скрипт.


скажите как можно скрипт более лучше сделать
P.S. А вообще для таких просьб на форуме имеется "стол заказов".
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Скажите а как можно разукрасить нужный мне пиксель в нужный мне цвет.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Там где я ег нашёл


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

Ну у меня камера с реагировала что изменился цвет, как мне тот пиксель разукрасить в красный например.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Скажите, а как сделать поиск не определённого цвета,а ещё его оттенки
 

forfrends

Новичок
Сообщения
176
Репутация
3
еще вопрос по поводу PixelSearch
Как узнать координаты? То есть, у меня в браузере (опера) загружается картинка, и мне нужно отследить 1 определенный пиксель. Au3Info в опере отказывается работать и координат вообще не выдает. Ка мне определть нужные мне коорданаты?

Уже решил как:
сделал скрин экрана и закинул в графический редактор, там и узнал координаты
 

shm_alex

Новичок
Сообщения
34
Репутация
4
Arei сказал(а):
Скажите а как можно разукрасить нужный мне пиксель в нужный мне цвет.
Я выводил картинку в отдельный экран вот например вариант перевода некоторых картинок в серенький вариант вариант - требует библиотеку GDIP.au3- поищите на форуме эта библиотека есть
Код:
#include <GDIPlus.au3>
#include <GDIP.au3>
#Include <ScreenCapture.au3>
#include <GUIConstantsEx.au3>

func show_picture_in_grey($lx,$ly,$rx,$ry)
	Local $hGUI, $hBMP, $hBitmap, $hGraphic
	$hBMP = _ScreenCapture_Capture("",$lx,$ly,$rx,$ry,False)
	_GDIPlus_Startup ()

	; Draw bitmap to GUI
	$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP ($hBMP)
;======================	
	;$hGUI = GUICreate("GDI+", $rx-$lx, $ry-$ly,$lx, $ly)
	$hGUI = GUICreate("GDI+", $rx-$lx, $ry-$ly,-1, -1)
 	GUISetState()

	; Initialize GDI+ library
   for $x=0 to $rx-$lx 
	   for $y=0 to $ry-$ly
		   $iColor=BitAND(_GDIPlus_BitmapGetPixel($hBitmap,$x,$y),0x00FFFFFF)
		   $GreyColor= brightness($iColor)
		   $GreyColor=$GreyColor+BitShift($GreyColor,-8)+BitShift($GreyColor,-16)
;~ 		   if ($GreyColor>128)and($iColor<>0xE81B22)and($iColor<>0xFF333A) Then
;~ 			   $GreyColor=0x00FFFFFF
;~ 		   Else   
;~ 			   $GreyColor=0
;~ 			EndIf   
		   _GDIPlus_BitmapSetPixel($hBitmap,$x, $y, $GreyColor)
		Next   
	Next
	$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
	
	_GDIPlus_GraphicsDrawImage ($hGraphic, $hBitmap, 0, 0)

	; Clean up resources
	_GDIPlus_GraphicsDispose ($hGraphic)
	_GDIPlus_BitmapDispose ($hBitmap)
	_WinAPI_DeleteObject ($hBMP)

	; Shut down GDI+ library
	_GDIPlus_ShutDown ()

	; Loop until user exits
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE

;======================	
EndFunc	
func brightness( $iColor )
	local $Red=BitShift(BitAND(Int($iColor),0x00FF0000),16)
	local $Green=BitShift(BitAND(Int($iColor),0x0000FF00),8)
	local $Blue=BitAND(Int($iColor),0x000000FF)
	return Int(Sqrt(($Red*$Red+$Green*$Green+$Blue*$Blue)/3))
EndFunc

Для того чтоб раскрасить точки можете вставлять вместо GreyColor любой цвет _GDIPlus_BitmapSetPixel($hBitmap,$x, $y, $GreyColor)
а если надо динамически что-то раскрашивать наверно надо точки рисовать с помощью винайпи где то я видел пример... мне кажется в хелпе , но как и где рисовалось я не понял , эффект был такой что рисунок рисовался как-бы поверх всех окон .
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
но мне надо как раз в том же окне рисовать, или над ним


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

Покажите пример с рисованием с помощью винайпи.Заранее спасибо.
 

shm_alex

Новичок
Сообщения
34
Репутация
4
Arei сказал(а):
но мне надо как раз в том же окне рисовать, или над ним


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

Покажите пример с рисованием с помощью винайпи.Заранее спасибо.



Я не знаю как ввинде все процессы устроены. Но мне кажется винда не позволит лезть(писать в память) извне (из процесса AutoIt) в процесс запущенного другого приложения... Если конечно у этого процесса нет специально заведённого для этого механизьма. Так что в том же окне не получится (если это не paint brush :smile: :smile: ).
может вот это поможет ->
http://autoit-script.ru/index.php/topic,47.msg6402.html#msg6402

у меня этот пример работает долго, но возможно с меньшим количеством точек будет работать быстрее , я уж не знаю какая из функций работает и медленно (_WinAPI_GetPixel или _WinAPI_SetPixel наверно существует способ убыстрить всё это ) Или может пойти на хитрость выводить в прозрачное окно точки ваши , а так есть куча функций для рисования линий кружочков и прочей лабуды в напр _WinAPI_DrawLine

в общем этот форум кладезь знаний =)
 
Верх