Jump to content

Recommended Posts

Posted

Hi all.

I needed to search some pixelcolor on the whole screen. The problem is, my color has different shades, but just in one color component , i.e. it changes from 0x0000CC to 0x0000FF.

So wenn im searching with Pixelsearch function with shades 32 i get a lot of fake hits. What i need is a Pixelsearch with ability to specify shades separately for each color component (RGB).

So I wrote this function, and it works, but much slower then original function :)

If you want to use it on big areas you should specify step > 1, im using 4 to check a screen and it takes ~10-15 sec

Maybe someone can optimize it or point me to usefull info, how can i make it.

;===============================================================================
; Function Name:    myPixelSearch()
; Description:      similar to PixelSearch, but you can specify shades for
;                   each color
; Parameter(s):     x1,$y1,$x2,$y2,$color, $shadered, $shadegreen, $shadeblue,$step
; Return Value(s):  The array with coordinates of the pixel
;                   or @error if nothing found
;author               : Detmyl
;===============================================================================
Func myPixelSearch($x1, $y1, $x2, $y2, $color, $shade_red, $shade_green, $shade_blue, $step = 1)
    Dim $ret[2]
    $colorRGB = getRGB($color)

    For $y = $y1 To $y2 Step $step
        For $x = $x1 To $x2 Step $step
            $pixel_color = PixelGetColor($x, $y)
            $pixel_colorRGB = getRGB($pixel_color)
            If Abs($colorRGB[0] - $pixel_colorRGB[0]) > $shade_red Then
                ContinueLoop
            ElseIf Abs($colorRGB[1] - $pixel_colorRGB[1]) > $shade_green Then
                ContinueLoop
            ElseIf Abs($colorRGB[2] - $pixel_colorRGB[2]) > $shade_blue Then
                ContinueLoop
            Else
                $ret[0] = $x
                $ret[1] = $y
                Return $ret
            EndIf
        Next
    Next
    ;nothing found
    SetError(1)
    Return 0
EndFunc   ;==>myPixelSearch


;===============================================================================
; Function Name:    getRGB()
; Description:      returns R,G,B from the color
; Parameter(s):     $color RGB color 0x000000
; Return Value(s):  $arr[0] - Red
;           $arr[1] - Green
;           $arr[2] - Blue
;===============================================================================
Func getRGB($color)
    Dim $ret[3]
    $ret[0] = BitAND(BitShift($color, 16), 0xff)
    $ret[1] = BitAND(BitShift($color, 8), 0xff)
    $ret[2] = BitAND($color, 0xff)
    Return $ret
EndFunc   ;==>getRGB
  • 5 weeks later...

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...