Sgrovert Posted August 15, 2013 Posted August 15, 2013 I'm new to autoIt, and last week I've build some simple scripts. At the moment I want to make a program to interact with event's which happen on screen. I'm looking for a way to take a part of screen and put it in a multidimensional array. So for instance, I want to load all pixel values between (100,100) and (200,200) to a array of 100 x 100 x 3 (3 for RGB) I think I could make a screenshot, save it to an image. Load the image again, put the values in an array and take the desired part. But that's a lot of overhead and I think there is a simpler way. Can someone point me to the right functions so I can build what I want?
JohnOne Posted August 15, 2013 Posted August 15, 2013 PixelChecksum() AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
Starg Posted August 15, 2013 Posted August 15, 2013 You can make a screenshot without saving it to a file.
Edano Posted August 15, 2013 Posted August 15, 2013 would be easier to know the program you want to automate. is it a game ? [color=rgb(255,0,0);][font="'comic sans ms', cursive;"]FukuLeaks[/color][/font]
Malkey Posted August 16, 2013 Posted August 16, 2013 Maybe you could strip down, re-build, and modify this example to build what you want. expandcollapse popup#include <Array.au3> Local $x1 = 100, $y1 = 100, $x2 = 200, $y2 = 250 Local $aArr1 = _ArrayPixels($x1, $y1, $x2, $y2) ; Get Initial array ; Get initial checksum Local $checksum = PixelChecksum($x1, $y1, $x2, $y2) ; ****** Wait for the region to change, the region is checked every 100ms to reduce CPU load ****** While $checksum = PixelChecksum($x1, $y1, $x2, $y2) ; Move a window in PixelChecksum location to trigger event and exit loop. Sleep(100) WEnd Local $aArr2 = _ArrayPixels($x1, $y1, $x2, $y2) ; Get changed array of pixel Local $aArr3 = _ArraysCompare($aArr1, $aArr2) _ArrayDisplay($aArr3) ; Creates an array of pixel colours in the hex. RGB colour format, 0xRRGGBB, ; which represents degrees of the three(3) colour channels, Red, Green, and Blue. ; Where, 0xFFFFFF is white; 0xFF0000 is Red; 0x00FF00 is Green; 0x0000FF is Blue, and 0x000080 is a darken Blue. ; Pixels in rows $iX1 and $iX2, and pixels in columns $iY1 and $iY2 are included in the array. Func _ArrayPixels($iX1, $iY1, $iX2, $iY2, $hWnd = "") Local $aRet[$iY2 - $iY1 + 1][$iX2 - $iX1 + 1] Local $iXCount = 0, $iYCount = 0 For $j = $iY1 To $iY2 For $i = $iX1 To $iX2 $aRet[$iYCount][$iXCount] = "0x" & Hex(PixelGetColor($i, $j, $hWnd), 6) $iXCount += 1 Next $iXCount = 0 $iYCount += 1 Next Sleep(10) ; To reduce CPU load Return $aRet EndFunc ;==>_ArrayPixels ; Returns an array, where:- ; Blank means $aArray1[x][y] = $aArray2[x][y]; and ; Contents of $aArray2[x][y] when $aArray1[x][y] <> $aArray2[x][y] Func _ArraysCompare(ByRef $aArray1, ByRef $aArray2) Local $aRet[UBound($aArray1)][UBound($aArray1, 2)] For $j = 0 To UBound($aArray1, 2) - 1 For $i = 0 To UBound($aArray1) - 1 If $aArray1[$i][$j] = $aArray2[$i][$j] Then $aRet[$i][$j] = "" Else $aRet[$i][$j] = $aArray2[$i][$j] EndIf Next Next Sleep(10) ; To reduce CPU load Return $aRet EndFunc ;==>_ArraysCompare
Sgrovert Posted August 18, 2013 Author Posted August 18, 2013 Thanks for the ideas. PixelChecksum() and PixelGetColor() look like the functions I'm looking for. On 8/15/2013 at 10:50 PM, Edano said: would be easier to know the program you want to automate. is it a game ? Yes. Game is getting boring and last 2 months I'm building scripts to automate the boring parts. Thinking bout the scripts and building them, is more fun than the game itself at the moment. In a week or 2 I have some free time and I start working with the idea's in this topic.
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