Jump to content

Recommended Posts

Posted

i need a function that "counts" or "calculates a uniq id" of all white(0xFFFFFF) if possible any hexcolor pixels from x,y to x,y

WhiteCounter(100, 100, 200, 200)
Func WhiteCounter($whiteX, $whiteY, $whiteXX, $whiteYY)
$whitetemp = 0
    For $whitetempX = $whiteX To $whiteXX step 1
        For $whitetempY = $whiteY To $whiteYY step 1
            if Dec("FFFFFF") = PixelGetColor($whitetempX, $whitetempY) Then $whitetemp += 1
        Next
    Next
Return $whitetemp
EndFunc   ;==>WhiteCounter

this func is way to slow,

in some cases i have to call Pixelgetcolor 100k times ... screen res is 1920x1080

and if i change Step it's not accurate anymore

Posted

Hi,

try this...

#include <Array.au3>
#include <GDIPlus.au3>
#include <GDIPlusConstants.au3>
#include <ScreenCapture.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>

$t = TimerInit()
$count = WhiteCounter(1300, 200, 1400, 300)
$m = TimerDiff($t)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : time = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $count = ' & $count & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

$t = TimerInit()
$count = WhiteCounter2(1300, 200, 1400, 300)
$m = TimerDiff($t)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : time = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $count = ' & $count & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console


Func WhiteCounter($whiteX, $whiteY, $whiteXX, $whiteYY)
    $whitetemp = 0
    For $whitetempX = $whiteX To $whiteXX Step 1
        For $whitetempY = $whiteY To $whiteYY Step 1
            If Dec("FFFFFF") = PixelGetColor($whitetempX, $whitetempY) Then $whitetemp += 1
        Next
    Next
    Return $whitetemp
EndFunc   ;==>WhiteCounter2



Func WhiteCounter2($whiteX, $whiteY, $whiteXX, $whiteYY)
    _GDIPlus_Startup()
    $hbScreen = _ScreenCapture_Capture("", $whiteX, $whiteY, $whiteXX, $whiteYY, False)
    If @error Then MsgBox(0, "", "Fehler Screencapturewnd")
    $pBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hbScreen); returns memory bitmap
    If @error Then MsgBox(0, "", "Fehler BitmapCreateFromHBITMAP File")
    ;_GDIPlus_BitmapLockBits gibt $tagGDIPBITMAPDATA-Struktur zurück
    $BitmapData = _GDIPlus_BitmapLockBits($pBitmap, 0, 0, _GDIPlus_ImageGetWidth($pBitmap), _GDIPlus_ImageGetHeight($pBitmap), $GDIP_ILMREAD, $GDIP_PXF24RGB)
    If @error Then MsgBox(0, "", "Error locking region " & @error)
    $Stride = DllStructGetData($BitmapData, "Stride");Stride - Offset, in bytes, between consecutive scan lines of the bitmap. If the stride is positive, the bitmap is top-down. If the stride is negative, the bitmap is bottom-up.
    $Width = DllStructGetData($BitmapData, "Width");Image width - Number of pixels in one scan line of the bitmap.
    $Height = DllStructGetData($BitmapData, "Height");Image height - Number of scan lines in the bitmap.
    ;$pixelFormat = DllStructGetData($BitmapData, "PixelFormat");Pixel format - Integer that specifies the pixel format of the bitmap
    $Scan0 = DllStructGetData($BitmapData, "Scan0");Scan0 - Pointer to the first (index 0) scan line of the bitmap.
    $pixeldata = DllStructCreate("byte[" & (Abs($Stride) * ($Height)) & "]", $Scan0)
    ;$BMPDataStart = DllStructGetData($pixeldata, 1) ;string im Struct-format, d.h. Byte+nulByte, in dem die pixeldaten im BGR-Format stehen
    $BMP = StringTrimLeft(DllStructGetData($pixeldata, 1), 2)

    $r = StringReplace($BMP, "FFFFFF", "BBBBBB")
    $w = @extended
    $BMP = ""
    $pixeldata = 0
    _GDIPlus_BitmapUnlockBits($pBitmap, $BitmapData)
    _GDIPlus_ImageDispose($pBitmap)
    _WinAPI_DeleteObject($hbscreen)
    _GDIPlus_Shutdown()
    Return $w
EndFunc   ;==>WhiteCounter
it´s 15 times faster, but there are 2 different sum of white pixel! My function returns on a white screen 10000 (100x100pixel) but your function returns 10102(101x101pixel).You should adapt this.

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...