GDI+ - Zuvor gezeichnetes Rechteck löschen und erneut auf Oberfäche malen

  • Guten Abend euch allen!

    Ich versuche gerade aus einem Bild einen Bereich mit Hilfe von GDI+ herauszuschneiden. Das Bild wird auf die GUI gemalt. Dann sollte ein Bereich auswählbar sein (Links Klick + Ziehen) und wenn die Maus losgelassen wird dieser gespeichert werden. Leider weiß ich nicht wie man ein zuvor gemaltes Rechteck wieder entfernen kann, sodass immer ein neues halbtransparentes überlagernd Gezeichnet wird - Folge ist, dass man nicht mehr sieht was man auswählt.

    Hat jemand vielleicht eine Idee, wie ich dieses Problem lösen kann? Ich habe das Rechteck mit GDI+ und nicht mit Hilfe einer zweiten GUI gemacht, da ich dies als schöner Emfinde.

    Hier erstmal der Code:

    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here
    #include <ScreenCapture.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>

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

    Opt("WinTitleMatchMode", 1)
    Opt("GUIOnEventMode", 1)
    HotKeySet("^b", "_get")

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

    #region ### START Koda GUI section ### Form=
    $hForm = GUICreate("", 169, 54, 192, 124, 0)
    GUISetCursor(3);
    #endregion ### END Koda GUI section ###

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "close", $hForm)

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

    ;Global $mTempPos[2]
    $winHandle = WinGetHandle("")
    If $winHandle = 0 Then Exit
    $winPos = WinGetPos("")
    If $winPos = 0 Then Exit
    WinMove($hForm, "", "", "", $winPos[2], $winPos[3])
    _GDIPlus_Startup();
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hForm)
    $hRectBrush = _GDIPlus_BrushCreateSolid(0x33FF0000)
    $hDelBrush = _GDIPlus_BrushCreateSolid(0x00FFFFFF)

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

    While 1
    If WinActive($hForm) Then
    If (_IsPressed(01)) Then
    $mPos = MouseGetPos();
    $mTempPos = $mPos;
    $hGraphicRec = _GDIPlus_GraphicsCreateFromHWND($hForm)

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

    While (_IsPressed(01))
    $mNewPos = MouseGetPos()
    If ($mNewPos[0] <> $mTempPos[0] Or $mNewPos[1] <> $mTempPos[1]) Then
    _GDIPlus_GraphicsFillRect($hGraphicRec, $mPos[0],$mPos[1],$mNewPos[0]-$mPos[0],$mNewPos[1]-$mPos[1], $hRectBrush)
    EndIf
    $mTempPos = $mNewPos
    WEnd

    ElseIf _IsPressed(02) Then
    GUISetState(@SW_HIDE, $hForm)
    EndIf
    Sleep(50)
    EndIf
    WEnd

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

    Func close()
    Exit
    EndFunc ;==>close

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

    Func _takeScreen()
    $hBitmap = _ScreenCapture_CaptureWnd("", $winHandle)
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    GUISetState(@SW_SHOW, $hForm)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
    Return (1)
    EndFunc ;==>_takeScreen

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

    Func _get()
    _takeScreen()
    EndFunc ;==>_getBot

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

    Und weiß jemand wie ich aus meinem Ursprungsbild den ausgewählten Bereich herausschneiden und speichern kann?

    Ich freue mich über jede Antwort!

    Vielen Dank im Voraus und viele Grüße,

    Lennart

    Jaja, Moo does the Cow!

    Einmal editiert, zuletzt von Lenny (29. November 2011 um 21:23)

  • Zum übermalen: Einfach das Bild von vorher nochmak drübermalen (Evtl abspeichern wenn Bereich ausgewählt wird)

    Um einen Bereich auszuschneiden benutzt man

    [autoit]

    _GDIPlus_BitmapCloneArea($hBmp, $iLeft, $iTop, $iWidth, $iHeight[, $iFormat = 0x00021808])

    [/autoit]


    Dann kannst du mit

    [autoit]

    _GDIPlus_ImageSaveToFile($hImage, $sFileName)

    [/autoit]

    den Bereich abspeichern.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Hallo!

    Vielen Dank, habe es nun so gemacht:

    [autoit]

    #include <ScreenCapture.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>

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

    Opt("WinTitleMatchMode", 1)
    Opt("GUIOnEventMode", 1)
    HotKeySet("^b", "_get")

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

    #region ### START Koda GUI section ### Form=
    $hForm = GUICreate("", 169, 54, 192, 124, 0)
    GUISetCursor(3);
    #endregion ### END Koda GUI section ###

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "close", $hForm)

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

    ;Global $mTempPos[2]
    $winHandle = WinGetHandle("")
    If $winHandle = 0 Then Exit
    $winPos = WinGetPos("")
    If $winPos = 0 Then Exit
    WinMove($hForm, "", "", "", $winPos[2], $winPos[3])
    _GDIPlus_Startup();
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hForm)
    $hRectBrush = _GDIPlus_BrushCreateSolid(0x33FF0000)
    $hSImage = 0
    Global $hBitmap = 0;

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

    While 1
    If WinActive($hForm) Then
    If $hSImage[1] <> 0 Then
    If (_IsPressed(01)) Then
    $mPos = MouseGetPos();
    $mTempPos = $mPos;

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

    While (_IsPressed(01))
    $mNewPos = MouseGetPos()
    If ($mNewPos[0] <> $mTempPos[0] Or $mNewPos[1] <> $mTempPos[1]) Then
    _GDIPlus_GraphicsDrawImage($hGraphic, $hSImage[1], 0, 0)
    _GDIPlus_GraphicsFillRect($hGraphic, $mPos[0], $mPos[1], $mNewPos[0] - $mPos[0], $mNewPos[1] - $mPos[1], $hRectBrush)

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

    EndIf
    $mTempPos = $mNewPos
    If _IsPressed(02) Then
    $hClone = _GDIPlus_BitmapCloneArea($hSImage[1], $mPos[0], $mPos[1], $mNewPos[0] - $mPos[0], $mNewPos[1] - $mPos[1])
    _GDIPlus_ImageSaveToFile($hClone, @ScriptDir & "/SCR/scr_" & @HOUR & @MIN & @SEC & @MDAY & @MON & @YEAR & ".jpg")
    _GDIPlus_BitmapDispose($hClone)
    _WinAPI_DeleteObject($hSImage[0])
    GUISetState(@SW_HIDE, $hForm)
    ExitLoop
    EndIf
    WEnd

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

    ElseIf _IsPressed(02) Then
    _WinAPI_DeleteObject($hSImage[0])
    GUISetState(@SW_HIDE, $hForm)
    EndIf
    Sleep(50)
    EndIf
    EndIf
    WEnd

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

    Func close()
    _GDIPlus_BitmapDispose($hClone)
    _WinAPI_DeleteObject($hSImage[0])
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BrushDispose($hRectBrush)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>close

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

    Func _takeScreen()
    Dim $hHandles[2]
    $hHandles[0] = _ScreenCapture_CaptureWnd("", $winHandle)
    $hHandles[1] = _GDIPlus_BitmapCreateFromHBITMAP($hHandles[0])
    GUISetState(@SW_SHOW, $hForm)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hHandles[1], 0, 0)
    Return ($hHandles)
    EndFunc ;==>_takeScreen

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

    Func _get()
    $hSImage = _takeScreen()
    EndFunc ;==>_get

    [/autoit]

    Grüße,
    Lenny

    Jaja, Moo does the Cow!