# Pixel Check Sum: can I use it for math calculations?

## Recommended Posts

I could use a bit of math help.

What I'd like to do is sample a 5x5 pixel area with PixelChecksum. I would then sample again a few seconds later to check for a change as seems to be the normal usage.

Can I do any useful maths on the PixelChecksum results? For instance, if I subtracted the two sample values would it tell me anything about pixel color content? Might I know that a color shift has happened to maybe Blue or Red for instance? Or would I have to do that on a per pixel sample? And if that is the case... what math would i use to compare an RGB value against another to detect a shift in color from neutral towards Red or Blue?

From the docs:

Quote

A checksum only allows you to see if "something" has changed in a region - it does not tell you exactly what has changed.

```Func _testShift()
; with PixelChecksum
Local \$toler=5
Local \$PCS1 = PixelChecksum(\$x + \$toler, \$y + \$toler, \$x - \$toler, \$y - \$toler, 1, \$windowHandle , 0)
Sleep(200)
Local \$PCS2 = PixelChecksum(\$x + \$toler, \$y + \$toler, \$x - \$toler, \$y - \$toler, 1, \$windowHandle , 0)
If \$PCS1 <> \$PCS2 Then
; How to compare these meaningfully for colorshift?

; or with single pixel....
Local \$px1 =    PixelGetColor(\$x, \$y, \$windowHandle)
Local \$pxRGB1 = _ColorGetRGB(\$px1)
Sleep(200)
Local \$px2 =    PixelGetColor(\$x, \$y, \$windowHandle)
Local \$pxRGB2 = _ColorGetRGB(\$px2)
If \$px1 <> \$px2 Then
If \$pxRGB1[0] < \$pxRGB2[0] Then Red?
If \$pxRGB1[2] < \$pxRGB2[2] Then Blue?

EndFunc```

##### Share on other sites

In order to do that, I believe you would need to reverse the algorithm used (adler) to create the checksum, unfortunately I do not believe it can be reversed because it is essentially a hash (one way encryption).

I am not 100% on that, but fairly confident of it.

Edited by JohnOne

Monkey's are, like, natures humans.

##### Share on other sites

The only thing i can think of is something like this, it can get improved a lot, but this should give you the idea:

```#include <Array.au3>

Func RegionGetPixelSum(Const \$point_x, Const \$point_y, Const \$nSize, Const \$nPrecision = 1)
Local \$aRet[1] = [0]
Local \$n = 1

For \$x = 0 To \$nSize-1 Step \$nPrecision
For \$y = 0 To \$nSize-1 Step \$nPrecision
ReDim \$aRet[\$n + 1]
\$aRet[\$n] = PixelGetColor(\$point_x + \$x, \$point_y + \$y)
\$n += 1
Next
Next

\$aRet[0] = \$n - 1
Return \$aRet
EndFunc   ;==>CheckPixel

Local const \$start_x = 555
Local const \$start_y = 555
Local Const \$Size = 5; will be 5x5
Local Const \$Spacing = 2; How much spacing between each pixel check

; Move our mouse so we know where to start search
MouseMove(\$start_x, \$start_y)

; What region we want to keep an eye on
Local Const \$sample = RegionGetPixelSum(\$start_x, \$start_y, \$Size, \$Spacing)

; Store result here
Local \$aResult[1][2]
Local \$n = 0
; If we found something
Local \$foundsomething = False

while 1
; Constantly check for changes
Local \$test = RegionGetPixelSum(\$start_x, \$start_y, \$Size, \$Spacing)

for \$i = 1 to \$sample[0]
for \$y = 1 to \$test[0]
; Store all id of changes
if \$sample[\$i] <> \$test[\$y] Then
\$foundsomething = True
ReDim \$aResult[\$n + 1][2]
\$aResult[\$n][0] = \$sample[\$i]
\$aResult[\$n][1] = \$test[\$y]
\$n+=1
EndIf
Next
Next

if \$foundsomething Then
ExitLoop
EndIf
WEnd

_ArrayDisplay(\$aResult,"Sample colours | Test colours")```

## Create an account

Register a new account

• ### Similar Content

• By Dave1
Hello everyone,
I have several signals on the screen that need to be monitored while a program is running. These signals are scattered around an image which is maximized on 4  equal resolution screens - the AutoIT Window Info does not recognize any objects on the program meaning that I'm left with the PixelSearch() and PixelCheckSum() functions to monitor the signals:
The signals are as small as a 5x5 pixel area and their coordinates are known.
I've been digging around for a while now in this forum about the PixelSearch() and PixelCheckSum()  and found some interesting and useful ideas for the use of them. I also came across some other UDF functions like MultiMon(), FastFind(), TtColXY() and the ImageSearch2015 scripts that might be useful for the final output. I don't know if hovering the mouse by using TtColXY() and output its ToolTip() information onto the log file will be faster than using PixelSearch() and/or PixelCheckSum() in a loop for all signals' coordinates.
The colours of the signals are below:
red - 0x00FF00 (opaque red)
green - 0x00FF00 (opaque green)
yellow - 0xFFFF00 (opaque yellow)
black - 0x000000 (opaque black, default colour)
EDIT:
The desired output is to monitor and record/log the changes and status of each inside a .txt file or a .csv with the below format:
Local Machine Time        Signal,      Change,               delta-t
14:32:07                  Signal1     Green - Yellow         DELTA-t1
14:34:02                  Signal1     Yellow - Red           DELTA-t1
14:35:14                  Signal2     Yellow - Red           DELTA-t2
...
Below is the code I came up with.
1 - I'm not sure about how to put the message into the log file.
2 - I tested this script but it is not recording the message into the log file.
3 - Is there other way to calculate the duration in these lines?
\$iTimeDiffh = _DateDiff('h', \$tChange, \$tCurrent) ; time difference in hours \$iTimeDiffm = _DateDiff('n', \$tChange, \$tCurrent) ; time difference in minutes \$iTimeDiffs = _DateDiff('s', \$tChange, \$tCurrent) ; time difference in seconds \$durationCheckSum = \$iTimeDiffh & ":" & \$iTimeDiffm & ":" & \$iTimeDiffs ; Timestamp of the signal until PixelCheckSum \$sLogMsg = " " & \$SignalID[0] & " " & \$ColourCheckID & " - " & \$NewCheckID & " " & \$durationCheckSum _FileWriteLog(\$LogFile, \$sLogMsg) Thanks in advance!

• Hey.
Is there anything that does the same thing as this?

Namely I'm talking about detecting when something has changed on screen.
The FastFind library is crashing without any errors after running:
FFSnapShot(\$left, \$top, \$right, \$bottom, 0) FFSnapShot(\$left, \$top, \$right, \$bottom, 1) \$diff = FFLocalizeChanges(0, 1) And then trying to overwritite the old snapshot (0 or 1).
If I use always different snapshot numbers its using too much memory and will eventually crash my pc.

It takes 2 snapshots and compares them returning the area that has changed very quickly (left, top, right ,bottom).
Can anyone help me do this?
Looping PixelGetColor would require a bunch of extra code to my purpose and its not as efficient...

Thanks

• By dejhost
Happy New Year everyone!
I would like to extract the color values of certain pixels in an image.  This is how I picture the workflow:
User opens an image of his choice. Image is shown on the screen. User draws a line into the image. This happens by marking the startpixel and the endpixel of the line The line is drawn, so the user can check visually if he is happy with the line.  The following pixel based properties belonging to the line are stored in Excel: X-Coordinate Y-Coordinate Color Value Additional operations: Extracting for max- and min. color values; Statistical operations.   Browsing through the helpfile of AutoIt I find plenty of functions for treating images (e.g. GDIPlus), but I am completely unsure if Autoit will get me there. Should I read the entire image into an array? Should I rather attempt to script an external image software (e.g. IrfanView, Gimp)?
I would be very thankful if someone could give some recommendations and maybe list a couple of the most important commands to use.
Thank you very much.
Dejhost

• By tiye0405
Hello,

I currently have a problem that deals with moving the mouse to a given location + or - a certain distance.
\$search1 =_WaitForImageSearch("envelope.bmp", 10, 1, \$x, \$y, 20)
\$search2 =_WaitForImageSearch("envelope2.bmp", 10, 1, \$x, \$y, 20)

If \$search1 = 1 Then
Sleep(100)
MouseMove(\$x, \$y, 10)
sleep(99)
MouseClick("left")
Sleep(99)
ElseIf \$search2 = 1 Then
Sleep(100)
MouseMove(\$x, \$y2, 10)
sleep(99)
MouseClick("left")
Sleep(100)
Else
Sleep(150)
MouseMove(\$x2, \$y, 10)
Sleep(150)
MouseClick("left")
Sleep(150)
EndIf
The problem about this is that i defined \$x2 = \$x - 175  and \$y2 = \$y + 35
I got these numbers ( 175 and 35) with the autoit helper and just subtracted point where it is to the point its supposed to move but it doesnt work.

is there any proper way to find the distance between 2 points in pixels?

Imgsearch doesnt always work for this picture so i want it to have a backup

edit: could it be that the definition of \$x and \$y  from the previous image search arent there anymore and thats why it moves my mouse to strange places?
is there a way to preserve the \$x \$y from the previous img search untill the next succesful one?

• Hey there!

Is there a way to detect movement only for 1 specific window?

HWnd is not really working, it still detects movement in all the windows within the region

This is my script:

;Checksum actual HotKeySet("{f2}", 'exit_') MsgBox(0, '', '0') Beep(500, 2000) \$Hwnd = WinActive('') while 1 \$Checksum = PixelChecksum(211, 650, 1094, 914, 1, \$Hwnd) If PixelChecksum(211, 650, 1094, 914, 1, \$Hwnd) <> \$Checksum Then For \$i = 1 To 100 Beep(1000, 50) Next MsgBox(0, '', 'New message!', 1) EndIf WEnd Func exit_() Beep(500, 1000) Exit 0 EndFunc I just want to check whenever a message comes because the app i use doesn't give notifications properly.

Any help is really appreciated!
×

• Wiki

• Back

• #### Beta

• Git
• FAQ
• Our Picks
×
• Create New...