Scan Screen - Ergebnis sortiert

    • Offizieller Beitrag

    Hallo,

    für eine Funktion benötigte ich die Position von Anzeigen, die aber je nach Bildschirmauflösung stark variieren.
    Um nicht jedes Mal den gesamten Screen zu scannen, habe ich eine Funktion erstellt, die mir einmalig für die aktuelle Auflösung alle Positionen der gewünschten Farbe ermittelt und 2-stufig sortiert ( nach X und bei gleichen X nach Y ) und in eine Datei ausgibt.

    Edit: Tipp - Rastergröße ($step) nicht kleiner als 4 wählen. Sonst kann man Kaffee trinken gehen.
    Beendigung des Scans wird mittels Beep bekanntgegeben.

    Spoiler anzeigen
    [autoit]


    Dim $DateiOut = @ScriptDir & "\Farbbereiche.txt"
    Dim $Farbe = 0x00314A
    Dim $Schrittweite = 12

    [/autoit] [autoit][/autoit] [autoit]

    _pix_scan($Farbe, $Schrittweite, $DateiOut)

    [/autoit] [autoit][/autoit] [autoit]

    ;------------------------------------------------------------------------------------------------------------
    ; Funktion _pix_scan($color, $step, $file)
    ;
    ; Beschreibung scannt Display nach gesuchter Farbe, Ausgabe in Datei
    ; Pixelbereiche 2-stufig sortiert
    ;
    ; Parameter $color: zu suchende Farbe
    ; $step: Rastergröße
    ; $file: Ausgabedatei
    ;
    ; Return Datei mit den gefundenen Pixelpositionen
    ;
    ; Erfordernisse Funktion: _ArraySort_2ary( )
    ; Nach dem Funktionsaufruf wird der Scan erst mit {F9} gestartet
    ; um z.B. vorab ein Spiel starten zu können
    ;
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;------------------------------------------------------------------------------------------------------------
    #include <File.au3>
    #Include <Misc.au3>
    Func _pix_scan($color, $step, $file)
    Local $endX = @DesktopWidth, $endY = @DesktopHeight
    Local $left = 0, $top = 0, $right = $step, $bottom = $step
    Local $arPos, $arSort[1][1]
    Do
    Sleep(100)
    Until _IsPressed("78") ; F9
    $fh = FileOpen($file,1)
    Do
    For $left = 0 To $endX Step $step
    $pos = PixelSearch($left, $top, $right, $bottom, $color, 0, $step)
    If IsArray($pos) Then FileWriteLine($file, $pos[0] & "|" & $pos[1])
    $right += $step
    Next
    $left = 0
    $right = $step
    $top += $step
    $bottom += $step
    Until $bottom > $endY
    FileClose($fh)
    Beep(500, 2000)
    _FileReadToArray($file, $arPos)
    FileDelete($file)
    ReDim $arSort[UBound($arPos)][2]
    For $i = 0 To UBound($arPos)-1
    $var = StringSplit($arPos[$i], "|")
    If ( IsArray($var) And UBound($var) = 3 ) Then
    $arSort[$i][0] = Number($var[1])
    $arSort[$i][1] = Number($var[2])
    EndIf
    Next
    $arSort = _ArraySort_2ary($arSort)
    $fh = FileOpen($file,1)
    For $i = 0 To UBound($arSort)-1
    If $arSort[$i][0] <> "" And $arSort[$i][1] <> "" Then _
    FileWriteLine($fh, "X: " & $arSort[$i][0] & " , Y: " & $arSort[$i][1])
    Next
    FileClose($fh)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;------------------------------------------------------------------------------------------------------------
    ; Funktion _ArraySort_2ary($ARRAY [, $DIM=0 [, $ASCENDING=0]])
    ;
    ; Beschreibung sortiert ein 2D-Array 2-stufig
    ;
    ; Parameter $ARRAY: zu sortierendes Array
    ; optional $DIM: HauptSortierIndex (default 0; 1.Dimension)
    ; optional $ASCENDING Sortierung auf[1]/ab[0] -steigend (default 0; aufsteigend)
    ;
    ; Return das 2-stufig sortierte Array
    ;
    ; Erfordernisse Wenn dass Array Zahlenwerte enthält, muss sichergestellt sein,
    ; dass diese vom Typ "Number" sind
    ; BaseIndex 0 und Sortierung des gesamten Arrays
    ;
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;------------------------------------------------------------------------------------------------------------
    #include <Array.au3>
    Func _ArraySort_2ary($ARRAY, $DIM=0, $ASCENDING=0)
    Local $FIRST = 0, $LAST, $tmpFIRST, $sortYES = 0, $arTmp[1][1]
    ; Sortierung Hauptdimension
    _ArraySort($ARRAY,$ASCENDING,0,0,2,$DIM)
    For $i = 0 To UBound($ARRAY)-1
    If $sortYES = 0 Then
    ; wenn Folgewert 1./2.Dimension gleich
    If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$DIM] = $ARRAY[$i+1][$DIM] ) Then
    $sortYES = 1
    $FIRST = $i
    EndIf
    ElseIf $sortYES = 1 Then
    ; wenn Folgewert 1./2.Dimension ungleich oder Arrayende
    If ( $i = UBound($ARRAY)-1 ) Or ( $ARRAY[$i][$DIM] <> $ARRAY[$i+1][$DIM] ) Then
    $sortYES = 0
    $LAST = $i +1
    ReDim $arTmp[$LAST-$FIRST][2]
    ; alle Einträge mit gleicher 1./2.Dimension in temp. Array auslagern
    $tmpFIRST = $FIRST
    For $k = 0 To UBound($arTmp)-1
    $arTmp[$k][0] = $ARRAY[$tmpFIRST][0]
    $arTmp[$k][1] = $ARRAY[$tmpFIRST][1]
    $tmpFIRST += 1
    Next
    ; temp. Array sortieren nach 1./2.Dimension
    $tmpFIRST = $FIRST
    Switch $DIM
    Case 0
    _ArraySort($arTmp,$ASCENDING,0,0,2,1) ; sortieren 2.Dimension
    ; zurückschreiben in Ausgangsarray (nur 2.Dimension)
    For $k = 0 To UBound($arTmp)-1
    $ARRAY[$tmpFIRST][1] = $arTmp[$k][1]
    $tmpFIRST += 1
    Next
    Case 1
    _ArraySort($arTmp,$ASCENDING,0,0,2,0) ; sortieren 1.Dimension
    ; zurückschreiben in Ausgangsarray (nur 1.Dimension)
    For $k = 0 To UBound($arTmp)-1
    $ARRAY[$tmpFIRST][0] = $arTmp[$k][0]
    $tmpFIRST += 1
    Next
    EndSwitch
    EndIf
    EndIf
    Next
    Return($ARRAY)
    EndFunc ;==>_ArraySort_2ary

    [/autoit]