_ScreenCapture_Capture verursacht Fehler

  • Hallo,

    ich verwende eine Schleife um mehrere Screenshots von verschiedenen Bildbereichen zu erstellen.
    Wenn ich ca. 20 Screenshots erstelle, dann werden jedoch nicht alle Screenshots erstellt.
    Ich habe schon herausgefunden, dass die Funktion _ScreenCapture_Capture einen Fehler verursacht.

    Hier habe ich mal den relevanten Code-Auszug:

    Spoiler anzeigen
    [autoit]

    For $i = 0 To (UBound($arrCsvItems)-1)

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

    ; Festlegen der Eckpunkte (sortiert)
    If $arrCsvItems[$i][0] > $arrCsvItems[$i][2] Then
    $arrItemCoords[0] = $iEdgeX + $arrCsvItems[$i][2]
    $arrItemCoords[2] = $iEdgeX + $arrCsvItems[$i][0]
    Else
    $arrItemCoords[0] = $iEdgeX + $arrCsvItems[$i][0]
    $arrItemCoords[2] = $iEdgeX + $arrCsvItems[$i][2]
    EndIf
    If $arrCsvItems[$i][1] > $arrCsvItems[$i][3] Then
    $arrItemCoords[1] = $iEdgeY + $arrCsvItems[$i][3]
    $arrItemCoords[3] = $iEdgeY + $arrCsvItems[$i][1]
    Else
    $arrItemCoords[1] = $iEdgeY + $arrCsvItems[$i][1]
    $arrItemCoords[3] = $iEdgeY + $arrCsvItems[$i][3]
    EndIf

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

    ; Debug
    ConsoleWrite($i & " " & $arrItemCoords[0] & ";" & $arrItemCoords[1] & ";" & $arrItemCoords[2] & ";" & $arrItemCoords[3] & @CRLF)

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

    ; Screenshot 1
    _ScreenCapture_Capture(@ScriptDir & "\tmp\" & StringFormat("%02d", $i) & "_l.tif", _
    $arrItemCoords[0], $arrItemCoords[1], $arrItemCoords[2], $arrItemCoords[3], _
    False)
    If @error Then
    MsgBox(0,0,"Fehler bei Screenshot")
    ConsoleWrite("fehler "& $i & @CRLF)
    SetError(0)
    EndIf

    ; Screenshot 2
    _ScreenCapture_Capture(@ScriptDir & "\tmp\" & StringFormat("%02d", $i) & "_r.tif", _
    377+$arrItemCoords[0], $arrItemCoords[1], 377+$arrItemCoords[2], $arrItemCoords[3], _
    False)
    If @error Then
    MsgBox(0,0,"Fehler bei Screenshot")
    ConsoleWrite("fehler "& $i & @CRLF)
    SetError(0)
    EndIf


    Sleep(50)
    Next

    [/autoit]

    Ich habe auch schon versucht die Koordinaten zu sortieren. Dies habe ich getan, damit die Left- und die Top-Koordinate immer kleiner sind, als die Right- und Bottom-Koordinate. Leider hat dies den Fehler auch nicht vermieden.
    Ich habe auch schon mal probiert, ob es an dem Dateityp liegt. Sowohl bei Bmp als auch bi Tif treten Fehler auf.

    Hier habe ich mal ein paar Ergebnisse aus der Konsole:

    Spoiler anzeigen

    Habt ihr eine Ahnung, woran es liegen kann, dass nicht immer alle Screenshots erstellt werden?

    Einmal editiert, zuletzt von reeky (31. Mai 2013 um 01:40)

  • Naja ist doch logisch, dass du einen Fehler erhältst, denn deine Koordinaten sind schlichtweg falsch:

    Code
    1 438;271;474;180
    fehler 1
    fehler 1

    Ein Blick in die Hilfe verrät uns:

    Code
    $sFileName 	[optional] Kompletter Pfad, Dateiname und Erweiterung der Bilddatei
    $iLeft 		[optional] X Koordinate des linken oberen Ecks des Rechtecks
    $iTop 		[optional] Y Koordinate des linken oberen Ecks des Rechtecks
    $iRight 	[optional] X Koordinate des rechten unteren Ecks des Rechtecks. Falls dies auf -1 gesetzt wird, wird die komplette Breite des Bildschirms genutzt.
    $iBottom 	[optional] Y Koordinate des rechten unteren Ecks des Rechtecks. Falls dies auf -1 gesetzt wird, wird die komplette Höhe des Bildschirms genutzt.
    $fCursor 	[optional] Falls "True", erscheint der Cursor auch auf dem erstellten Bild

    Also linke obere und rechte untere Ecke muss angegeben werden. Das bedeutet gleichzeitig, dass folgendes niemals der Fall sein darf:

    [autoit]


    ; auszug aus der screencapture.au3
    If $iRight < $iLeft Then Return SetError(-1, 0, 0)
    If $iBottom < $iTop Then Return SetError(-2, 0, 0)

    [/autoit]

    Oder anderst ausgedrückt:

    Der X-wert der linken oberen Ecke muss kleiner dem X-Wert der rechten unteren Ecke sein, da er eben links vom anderen Punkt liegen soll.
    Der Y-wert der linken oberen Ecke muss kleiner dem Y-Wert der rechten unteren Ecke sein, da er eben oberhalb vom anderen Punkt liegen soll. Das ist im oben genannten Koordinaten Beispiel nicht erfüllt, die Funktion wird @error daher auf -2 setzen!

  • Danke für die schnelle Antwort.
    Stimmt, das ist mir gar nicht aufgefallen. Ich werde das mal schnell abändern und, den Code posten, falls alles klappt.

  • Hallo,

    ich hab jetzt alles zum laufen bekommen.

    Diesen Part habe ich ersetzt und somit werden die Werte automatisch zugeordnet:

    [autoit]

    $arrItemCoords[0] = $iEdgeX + _Min(Number($arrCsvItems[$i][2]), Number($arrCsvItems[$i][0]))
    $arrItemCoords[2] = $iEdgeX + _Max(Number($arrCsvItems[$i][2]), Number($arrCsvItems[$i][0]))
    $arrItemCoords[1] = $iEdgeY + _Min(Number($arrCsvItems[$i][1]), Number($arrCsvItems[$i][3]))
    $arrItemCoords[3] = $iEdgeY + _Max(Number($arrCsvItems[$i][1]), Number($arrCsvItems[$i][3]))

    [/autoit]