cili1 Posted September 3, 2009 Share Posted September 3, 2009 The search is performed left-to-right, top-to-bottom and the first match is returned.How do I make a PixelSearch function that continues after the first result.Example:Start PixelSearchFound matching pixel!Msgbox(Cords)Looking for next.Found matching pixel 2!Msgbox(Cords)And so on... Link to comment Share on other sites More sharing options...
WolfWorld Posted September 3, 2009 Share Posted September 3, 2009 Get the cords and add 1 to it them do a search again, easy right! Main project - Eat Spaghetti - Obfuscate and Optimize your script. The most advance add-on.Website more of GadGets! Link to comment Share on other sites More sharing options...
jvanegmond Posted September 3, 2009 Share Posted September 3, 2009 Get the cords and add 1 to it them do a search again, easy right! WolfWorld, your answers are of poor quality and never provide much insight in the task at hand at all. Sometimes you misinform people completely by giving wrong answers. Giving a bad answer is not always avoidable but when 95% of the time your answers are bad and hastily made up, I think it might be time to stop. As for the original question. What WolfWorld is suggesting requires that you fragment the screen in a lot of seperate ways, creating a large and complicated recursive function that searches the screen. What I suggest as a more simple approach is using PixelGetColor to loop through the screen like this: _PixelSearchScreen(0xFF00FF) Func _PixelSearchScreen($color) $w = @DesktopWidth $h = @DesktopHeight For $x = 0 to $w For $y = 0 to $h If (PixelGetColor($x, $y) == $color)) Then _FoundColor($x, $y) EndIf Next Next EndFunc Func _FoundColor($x, $y) ConsoleWrite("Color was found on: " & $x & ", " & $y & @CRLF) EndFunc You'll find that this is rather slow! So I suggest using the UDF I wrote that significantly increases speed for a pixelsearch operation: http://www.autoitscript.com/forum/index.php?showtopic=63318 github.com/jvanegmond Link to comment Share on other sites More sharing options...
WolfWorld Posted September 3, 2009 Share Posted September 3, 2009 (edited) WolfWorld, your answers are of poor quality and never provide much insight in the task at hand at all. Sometimes you misinform people completely by giving wrong answers. Giving a bad answer is not always avoidable but when 95% of the time your answers are bad and hastily made up, I think it might be time to stop. As for the original question. What WolfWorld is suggesting requires that you fragment the screen in a lot of seperate ways, creating a large and complicated recursive function that searches the screen. What I suggest as a more simple approach is using PixelGetColor to loop through the screen like this: _PixelSearchScreen(0xFF00FF) Func _PixelSearchScreen($color) $w = @DesktopWidth $h = @DesktopHeight For $x = 0 to $w For $y = 0 to $h If (PixelGetColor($x, $y) == $color)) Then _FoundColor($x, $y) EndIf Next Next EndFunc Func _FoundColor($x, $y) ConsoleWrite("Color was found on: " & $x & ", " & $y & @CRLF) EndFunc You'll find that this is rather slow! So I suggest using the UDF I wrote that significantly increases speed for a pixelsearch operation: http://www.autoitscript.com/forum/index.php?showtopic=63318 That you provide his slow cause you are looping all the possible cords by using Autoit script itself. You can do this it's much faster and it work just the same. _PixelSearchScreen(0xFFFFFF) Func _PixelSearchScreen($color, $x = 0, $y = 0) $aTemp = PixelSearch($x, $y,@DesktopWidth, @DesktopHeight, $color) If (Not @error) Then _FoundColor($aTemp[0], $aTemp[1]) If ($aTemp[0] < @DesktopWidth) And ($aTemp[1] < @DesktopHeight) Then _PixelSearchScreen($color, $aTemp[0] + 1, $aTemp[1]) EndIf EndFunc ;==>_PixelSearchScreen Func _FoundColor($x, $y) ConsoleWrite("Color was found on: " & $x & ", " & $y & @CRLF) EndFunc ;==>_FoundColor Is this the better answer now? Edited September 3, 2009 by WolfWorld Main project - Eat Spaghetti - Obfuscate and Optimize your script. The most advance add-on.Website more of GadGets! Link to comment Share on other sites More sharing options...
cili1 Posted September 3, 2009 Author Share Posted September 3, 2009 Thank you both! I'll be going with Manadar's code since it was easy to modify and fast enough for what I need. Link to comment Share on other sites More sharing options...
jvanegmond Posted September 3, 2009 Share Posted September 3, 2009 That you provide his slow cause you are looping all the possible cords by using Autoit script itself. You can do this it's much faster and it work just the same. _PixelSearchScreen(0xFFFFFF) Func _PixelSearchScreen($color, $x = 0, $y = 0) $aTemp = PixelSearch($x, $y,@DesktopWidth, @DesktopHeight, $color) If (Not @error) Then _FoundColor($aTemp[0], $aTemp[1]) If ($aTemp[0] < @DesktopWidth) And ($aTemp[1] < @DesktopHeight) Then _PixelSearchScreen($color, $aTemp[0] + 1, $aTemp[1]) EndIf EndFunc ;==>_PixelSearchScreen Func _FoundColor($x, $y) ConsoleWrite("Color was found on: " & $x & ", " & $y & @CRLF) EndFunc ;==>_FoundColor Is this the better answer now? Your answer is much improved. However, as I said the problem is not the answer, it's the overall behavior. If all your posts were of this quality then this forum would be a much better place, ultimately benefiting everyone. However, your answer is still flawed. This is the search behavior that your function has where the black dots are found colors. The gray areas are new searches, and the red pieces are missed completely. github.com/jvanegmond Link to comment Share on other sites More sharing options...
WolfWorld Posted September 3, 2009 Share Posted September 3, 2009 (edited) Oops forgot that. Anyway thanks for the picture. Edited September 3, 2009 by WolfWorld Main project - Eat Spaghetti - Obfuscate and Optimize your script. The most advance add-on.Website more of GadGets! Link to comment Share on other sites More sharing options...
LarryDalooza Posted September 3, 2009 Share Posted September 3, 2009 I think I addressed this in my PixelAreaFind...the code is old and delapidated but the idea is to search, find, search to the end of the line, then start the search at the the next row. here is a snippet that I don't have time to clean up... Func find() $x = 0 $y = 0 $ypixel = $VIRTUALDESKTOPHEIGHT - 1 While 1 $xy = PixelSearch($x,$y,$VIRTUALDESKTOPWIDTH - 1,$ypixel,$pixel) If @error And $ypixel = ($VIRTUALDESKTOPHEIGHT - 1)Then MsgBox(4096,"Error","Could not find area.") Exit ElseIf @error Then $y = $ypixel + 1 $ypixel = ($VIRTUALDESKTOPHEIGHT - 1) $x = 0 ElseIf String($chksum) = String(PixelCheckSum($xy[0]-5,$xy[1]-5,$xy[0]+5,$xy[1]+5)) Then MouseMove($xy[0],$xy[1]) ToolTip("There it is.") Sleep(3000) Exit Else $y = $xy[1] $ypixel = $y $x = $xy[0] + 1 EndIf WEnd EndFunc AutoIt has helped make me wealthy Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now