Teile vom Bildschirm als Bild speichern?

  • Hi,

    ich möchte mir gerne ein Programm scripten, dass dem Anwender z.B. Beep signale ausgibt, wenn auf dem Bildschirm ein gewisser Bildausschnitt zu sehen ist. Dies ist mit ImageSearch möglich, allerdings möchte ich keine Bildausschnitte vorgeben, weil der Anwender die Bildausschnitte selber aussuchen können soll (was für ne Satz Konstruktion^^) Es soll also eine Art Achtungs-Alarm werden (z.B. wenn jemand etwas in seinem Gewusel aus Ordnern sucht oder so kA wie es die Anwender halt nutzen).

    Es soll mehr meine Fähigkeiten in AutoIt verbessern als alles andere und daher meine Frage:

    Ist es möglich mit einer Function AutoIt per Pixel angaben dazu zu bewegen von einem gewissen Teil des Bildschirms ein Bild zu machen und diesen abzuspeichern, sodass er jederzeit vom Programm wieder aufrufbar ist? Also das man zum Beispiel die Koordinaten "x,y,x2,y2" (x/y oben links, x2/y2 unten rechts) angibt und dann auf "Bild speichern" klickt und der Bildausschnitt an der Position x/y,x2/y2 wird gespeichert?

    Man ist das schwer zu erklären aber wenns nur einer verstanden hat der mir die Frage beantworten kann bin ich ja schon zu frieden xD

    the
    MrWong

    Einmal editiert, zuletzt von MrWong (26. Juli 2009 um 17:01)

  • ich glaube du meinst das hier:

    [autoit]

    _ScreenCapture_CaptureWnd

    [/autoit]


    in der Hilfe ist dazu ein Beispiel beschrieben.

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Zitat

    Oh xD Da sieht mans wieder: Manche Sachen sind so simpel das man nicht von selbst darauf kommt xD Danke schön =)

    Aber eine Frage hab ich dann doch noch wie kann ich denn nun die Bildgröße herausfinden? Danke

    the
    MrWong

  • Also mit dem AutoIT Info Tool (im Autoit Verzeichnis) kannst du die Koordinaten auslesen (falls du das meintest)
    und sonst kannst du von Bild die Größe mit

    [autoit]

    FileGetSize

    [/autoit]


    herausbekommen :P

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

    • Offizieller Beitrag

    Aber eine Frage hab ich dann doch noch wie kann ich denn nun die Bildgröße herausfinden? Danke


    Ich verstehe den Sinn deiner Frage nicht. Du willst doch nur einen bestimmten Bildausschnitt capturen. Dafür übergibst du die Koordinaten - also weißt du doch, welche Abmessungen dein Bild hat.

  • Die Koordinaten werden anhand der Mausposition ausgelesen und deswegen kenn ich die Bildgröße nicht (ist ja vollkommen Variabel), da ich aber auch gleichzeitig (zur Kontrolle) die Funktion einbinden möchte, dass die Anwender sich das Bild angucken können muss das Programm die größe des Bildes kennen (sonst ist das Bild verzerrt) und nochwas:

    Hab das jetzt mit _ScreenCapture_Capture gemacht, aber der speichert das Bild nicht unter dem Pfad indem ich das Bild haben möchte, trotzdem zeigt mir das Programm beim Test das gewünschte Bild, da stell ich mir die Frage wo speichert das Programm das Bild hin? Ohne den Pfad kann das Programm das Bild ja eigentlich nicht mehr finden zum Beispiel bei einem Neustart des Programms.

    the
    MrWong

    • Offizieller Beitrag

    Ich hab das Bsp. aus der Hilfe mal leicht verändert, so siehst du, wie du zu den Maßen kommst:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>

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

    _Main()

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

    Func _Main()
    Local $hWnd, $hBitmap, $hClone, $hImage, $iX, $iY, $hDC

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

    ; Initialize GDI+ library
    _GDIPlus_Startup ()

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

    ; Handle des aktiven Fensters holen
    $hWnd = WinGetHandle('[ACTIVE]')

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

    ; Capture 32 bit bitmap
    $hBitmap = _ScreenCapture_CaptureWnd ("", $hWnd)
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap)

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

    ; Create 24 bit bitmap clone
    $iX = _GDIPlus_ImageGetWidth ($hImage)
    $iY = _GDIPlus_ImageGetHeight ($hImage)

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

    MsgBox(0, 'Maße', 'Bildabmessung: ' & $iX & ' x ' & $iY)

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

    ; Clean up resources
    _GDIPlus_ImageDispose ($hClone)
    _GDIPlus_ImageDispose ($hImage)
    _WinAPI_DeleteObject ($hBitmap)

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

    ; Shut down GDI+ library
    _GDIPlus_ShutDown ()

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

    EndFunc ;==>_Main

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • öööööh ok Danke (ich bedanke mich schonmal davon ausgehend dass das die Lösung meines Problems sein sollte, denn bis hier hin hab ich nur bahnhof verstanden, werde mir den Code aber nochmal ganz genau angucken und bis ins Detail auseinander nehemen bis ich geschnallt hab was da eigentlich genau steht) :D

    the
    MrWong

  • Falls es dir um die derzeitige Mausposition geht (und du das AutoIT Info Tool nicht verwenden möchtest...)
    kannst du auch dieses Script vorher starten:

    [autoit]

    While 1
    $P=MouseGetPos()
    ToolTip("X: "&$P[0]&@CRLF&"Y: "&$P[1])
    Sleep(10)
    WEnd

    [/autoit]

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Ja das weiß ich das klappt auch aber das mit der Bildgröße will nicht...moment...ich hau mal kurz den Code hier rein:

    Spoiler anzeigen
    [autoit]

    #include <ScreenCapture.au3>

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

    HotKeySet("{NUMPAD0}", "_start")
    HotKeySet("{NUMPAD9}", "_ende")
    HotKeySet("{PGUP}", "_Bildshow")

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

    Global $heightP
    Global $widthP

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

    While (1)
    Sleep(1000)
    WEnd

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

    Func _start()
    MsgBox(64, "Info", "Bewege die Maus zur oberen linken Ecke des zu speichernden Bildes")
    Sleep(2000)
    $pos1 = MouseGetPos()
    MsgBox(64, "Info", "Nun zur unteren rechten Ecke des Bildes")
    Sleep(2000)
    $pos2 = MouseGetPos()
    _ScreenCapture_Capture(@ScriptDir&"test.jpg", $pos1[0], $pos1[1], $pos2[0], $pos2[1])
    $widthP = $pos1[1] + $pos2[1]
    $heightP = $pos1[0] + $pos2[0]
    MsgBox(64, "Info", "Bild gespeichert. Mit Bildauf kannst du es betrachten")
    MsgBox(64, "Info", "Es ist "&$widthP&" breit und "&$heightP&" hoch.")
    EndFunc

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

    Func _ende()
    Exit
    EndFunc

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

    Func _Bildshow()
    $File = FileExists(@ScriptDir&"test.jpg")
    If $File = 1 Then
    SplashImageon("Capture",@ScriptDir&"test.jpg", $widthP, $heightP)
    Else
    MsgBox(64, "Info", "Es gibt dein gewünschtes Bild nicht")
    EndIf
    EndFunc

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

    Natürlich funktioniert heightP und widthP nicht das ist mir im Nachhinein auch aufgefallen aber ein Versuch wars wert hehe naja egal wie finde ich bei dem Code die Bildgröße raus und wo speichert der das Bild hin? Denn im Script Verzeichnis ist es nicht ?? Trotz das die FileExists Funktion eine 1 als Rückgabewert hat...

    the
    MrWong

    • Offizieller Beitrag

    Hier nochmal der Code, aber auf Basis eines gespeicherten Bildes.

    Basis *.bmp
    [autoit]

    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>

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

    _Main()

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

    Func _Main()
    Local $hBitmap, $iX, $iY

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

    _GDIPlus_Startup()

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

    ; Capture 32 bit bitmap
    _ScreenCapture_Capture(@TempDir & '\capture.bmp')
    $hBitmap = _GDIPlus_BitmapCreateFromFile(@TempDir & '\capture.bmp')

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

    ; Create 24 bit bitmap clone
    $iX = _GDIPlus_ImageGetWidth ($hBitmap)
    $iY = _GDIPlus_ImageGetHeight ($hBitmap)

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

    MsgBox(0, 'Maße', 'Bildabmessung: ' & $iX & ' x ' & $iY)

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

    ; Clean up resources
    _WinAPI_DeleteObject ($hBitmap)

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

    ; Shut down GDI+ library
    _GDIPlus_ShutDown ()

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

    EndFunc ;==>_Main

    [/autoit]


    Edit:

    Basis *.jpg
    [autoit]

    #include <GDIPlus.au3>
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>

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

    _Main()

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

    Func _Main()
    Local $hBitmap, $iX, $iY, $hImage

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

    _GDIPlus_Startup()

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

    ; Capture 32 bit bitmap
    _ScreenCapture_Capture(@TempDir & '\capture.jpg')
    $hBitmap = _GDIPlus_BitmapCreateFromFile(@TempDir & '\capture.jpg')
    $hImage = _GDIPlus_ImageLoadFromFile(@TempDir & '\capture.jpg')

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

    ; Create 24 bit bitmap clone
    $iX = _GDIPlus_ImageGetWidth($hImage); ($hBitmap)
    $iY = _GDIPlus_ImageGetHeight($hImage); ($hBitmap)

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

    MsgBox(0, 'Maße', 'Bildabmessung: ' & $iX & ' x ' & $iY)

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

    ; Clean up resources
    _WinAPI_DeleteObject ($hBitmap)

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

    ; Shut down GDI+ library
    _GDIPlus_ShutDown ()

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

    EndFunc ;==>_Main

    [/autoit]


    Gib mal in der SuFu Screencapture ein, da findest du schon etliche Lösungen.

  • Du hattest das \ vergessen darum hat er das Bild nicht abgespeichert.

    Spoiler anzeigen
    [autoit]

    #include <ScreenCapture.au3>
    #Include <GDIPlus.au3>
    _GDIPlus_Startup()

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

    HotKeySet("{NUMPAD0}", "_start")
    HotKeySet("{NUMPAD9}", "_ende")
    HotKeySet("{PGUP}", "_Bildshow")

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

    Global $Bildheight
    Global $Bildwidth

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

    While 1
    Sleep(1000)
    WEnd

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

    Func _start()
    MsgBox(64, "Info", "Bewege die Maus zur oberen linken Ecke des zu speichernden Bildes")
    Sleep(2000)
    $pos1 = MouseGetPos()
    MsgBox(64, "Info", "Nun zur unteren rechten Ecke des Bildes")
    Sleep(2000)
    $pos2 = MouseGetPos()
    $hbitmap=_ScreenCapture_Capture(@ScriptDir&"\test.jpg", $pos1[0], $pos1[1], $pos2[0], $pos2[1])
    $hImage=_GDIPlus_ImageLoadFromFile(@ScriptDir&"\test.jpg")
    $Bildwidth = _GDIPlus_ImageGetWidth($hImage)
    $Bildheight = _GDIPlus_ImageGetHeight($hImage)
    MsgBox(64, "Info", "Bild gespeichert. Mit Bildauf kannst du es betrachten")
    MsgBox(64, "Info", "Es ist "&$Bildwidth&" breit und "&$Bildheight&" hoch.")
    EndFunc

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

    Func _ende()
    _GDIPlus_ImageDispose($Bildwidth)
    _GDIPlus_ImageDispose($Bildheight)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    Func _Bildshow()
    If FileExists(@ScriptDir&"\test.jpg") Then Run("MSPaint.exe " & '"' & @ScriptDir & '\test.jpg"')
    EndFunc

    [/autoit]
  • Zitat

    Danke euch beiden werd mich gleich ma ran setzen und zu Ende scripten.

    Danke

    the
    MrWong

    Spoiler anzeigen
    [autoit]

    #include <ScreenCapture.au3>
    #include <GDIPlus.au3>

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

    HotKeySet("{NUMPAD0}", "_start")
    HotKeySet("{NUMPAD9}", "_ende")
    HotKeySet("{PGUP}", "_Bildshow")

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

    Global $hClone, $hImage, $iX, $iY
    Global $Img

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

    While (1)
    Sleep(1000)
    WEnd

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

    Func _start()
    MsgBox(64, "Info", "Bewege die Maus zur oberen linken Ecke des zu speichernden Bildes")
    Sleep(2000)
    Global $pos1 = MouseGetPos()
    MsgBox(64, "Info", "Nun zur unteren rechten Ecke des Bildes")
    Sleep(2000)
    Global $pos2 = MouseGetPos()
    _ScreenCapture_SaveImage(@ScriptDir & "\test.jpg", $Img)
    MsgBox(64, "Info", "Bild gespeichert. Mit Bildauf kannst du es betrachten")
    _size()
    EndFunc ;==>_start

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

    Func _ende()
    Exit
    EndFunc ;==>_ende

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

    Func _Bildshow()
    $File = FileExists(@ScriptDir & "\test.bmp")
    If $File = 1 Then
    SplashImageOn("Screen", @ScriptDir & "\test.bmp", $iX, $iY, "-1", "-1", 18)
    Else
    MsgBox(64, "Info", "Es gibt dein gewünschtes Bild nicht")
    EndIf
    EndFunc ;==>_Bildshow

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

    Func _size()

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

    ; Initialize GDI+ library
    _GDIPlus_Startup ()

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

    ; Capture 32 bit bitmap
    $Img = _ScreenCapture_Capture(@ScriptDir & "\test.bmp", $pos1[0], $pos1[1], $pos2[0], $pos2[1])
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP ($Img)

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

    ; Create 24 bit bitmap clone
    $iX = _GDIPlus_ImageGetWidth ($hImage)
    $iY = _GDIPlus_ImageGetHeight ($hImage)
    $hClone = _GDIPlus_BitmapCloneArea ($hImage, 0, 0, $iX, $iY, $GDIP_PXF24RGB)

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

    ; Save bitmap to file
    _GDIPlus_ImageSaveToFile ($hClone, @ScriptDir & "\testClone.bmp")

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

    ; Clean up resources
    _GDIPlus_ImageDispose ($hClone)
    _GDIPlus_ImageDispose ($hImage)
    _WinAPI_DeleteObject ($Img)

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

    ; Shut down GDI+ library
    _GDIPlus_ShutDown ()
    MsgBox(64, "Größe", "X: "&$iX&" - Y: "&$iY&".")
    _BildShow()
    EndFunc ;==>_size

    [/autoit]

    Es geht nicht ^^ Weiß einer warum? Als X Wert bekomme ich "-1" und als Y Wert "0" ..?

    3 Mal editiert, zuletzt von MrWong (26. Juli 2009 um 22:22)

  • Oha wie doof von mir xD Hab mir deinen Code gar nicht richtig angesehen, weil ich dachte du hättest nur die \ eingefügt ^^ Funktioniert Perfekt! Danke danke danke =)

    €dit: Oder auch nicht ^^ Wenn ich das nutze funktioniert es wunderbar bis das Bild gespeichert wurde, dann wird ein Fehler festgestellt und AutoIt3 wird mit folgendem Satz beendet :

    Zitat

    !>07:20:19 AutoIT3.exe ended.rc:-1073741819

    Was hat das zu bedeuten?


    the
    MrWong

    Einmal editiert, zuletzt von MrWong (27. Juli 2009 um 07:20)

  • Hm ja beim beenden hat er noch gemeckert, habs mal verbessert:

    Spoiler anzeigen
    [autoit]

    #include <ScreenCapture.au3>
    #Include <GDIPlus.au3>
    _GDIPlus_Startup()

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

    HotKeySet("{NUMPAD0}", "_start")
    HotKeySet("{NUMPAD9}", "_ende")
    HotKeySet("{PGUP}", "_Bildshow")

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

    Global $Bildheight
    Global $Bildwidth

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

    While 1
    Sleep(1000)
    WEnd

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

    Func _start()
    MsgBox(64, "Info", "Bewege die Maus zur oberen linken Ecke des zu speichernden Bildes")
    Sleep(2000)
    $pos1 = MouseGetPos()
    MsgBox(64, "Info", "Nun zur unteren rechten Ecke des Bildes")
    Sleep(2000)
    $pos2 = MouseGetPos()
    $hbitmap=_ScreenCapture_Capture(@ScriptDir&"\test.jpg", $pos1[0], $pos1[1], $pos2[0], $pos2[1])
    $hImage=_GDIPlus_ImageLoadFromFile(@ScriptDir&"\test.jpg")
    Global $Bildwidth = _GDIPlus_ImageGetWidth($hImage)
    Global $Bildheight = _GDIPlus_ImageGetHeight($hImage)
    MsgBox(64, "Info", "Bild gespeichert. Mit Bildauf kannst du es betrachten")
    MsgBox(64, "Info", "Es ist "&$Bildwidth&" breit und "&$Bildheight&" hoch.")
    EndFunc

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

    Func _ende()
    If IsDeclared($Bildwidth) Then _GDIPlus_ImageDispose($Bildwidth)
    If IsDeclared($Bildheight) Then _GDIPlus_ImageDispose($Bildheight)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    Func _Bildshow()
    If FileExists(@ScriptDir&"\test.jpg") Then Run("MSPaint.exe " & '"' & @ScriptDir & '\test.jpg"')
    EndFunc

    [/autoit]
  • PERFEKT !! Also mehr als Danke sagen kann ich hier leider nicht deswegen gleich dreimal: DANKE DANKE DANKE !!

    =)

    the
    MrWong