GDI+ Bild wird gestaucht

  • Hi,

    bei folgenden Script wollte ich eigentlich lediglich, dass sich das Hintergrundbild statt der Figur verschieben. Anzumerken ist dabei, das das Hintergrundbildt mit "_GDIPlus_GraphicsDrawImageRectRect" wurde. Aber anstatt sich zu verschieben wir es einfach "zusammengestaucht".

    Please help ;(

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <Misc.au3>
    #include <StaticConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

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

    Opt("GuiOnEventMode", 1)

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

    OnAutoItExitRegister("_end")

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

    $x = 0
    $y = 0

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

    $Gui = GUICreate("Beispiel", 400, 400)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    _GDIPlus_Startup()

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

    $figur = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\test.png")
    $height = _GDIPlus_ImageGetHeight($figur)
    $width = _GDIPlus_ImageGetWidth($figur)
    $verhaelnis = $height / $width

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

    $bk = _GDIPlus_ImageLoadFromFile("back.png")

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

    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(431, 400, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap);

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

    GUISetState(@SW_SHOW)

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

    While 1
    Select
    Case _IsPressed(25)
    If $x > 0 Then
    $x -= 2
    EndIf
    Case _IsPressed(26)
    If $y > 0 Then
    $y -= 2
    EndIf
    Case _IsPressed(27)
    If $x < 410 Then
    $x += 2
    EndIf
    Case _IsPressed(28)
    If $y < 399 Then
    $y += 2
    EndIf
    EndSelect

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

    _GDIPlus_GraphicsDrawImageRectRect($buffer, $bk, $x, $y, 431, 400, $x, $y, 832, 800)
    _GDIPlus_GraphicsDrawImageRect($buffer, $figur, 200, 200, 20, 20 * $verhaelnis)
    _GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 0)
    WEnd

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

    Func CLOSEClicked()
    Exit
    EndFunc ;==>CLOSEClicked

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

    Func _end()
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_ImageDispose($figur)
    _GDIPlus_ImageDispose($bk)
    _GDIPlus_Shutdown()
    EndFunc ;==>_end

    [/autoit]
  • So besser?:

    [autoit]

    _GDIPlus_GraphicsDrawImageRectRect($buffer, $bk, 0, 0, 431, 400, -$x, -$y, 832, 800)

    [/autoit]

    Übrigens, das Bild wird nicht gestaucht, es sieht nur so aus, weil vom letzen Schleifendurchlauf noch "Bild Reste" übrig sind
    lösch am besten immer den Buffer mit

    [autoit]

    _GDIPlus_GraphicsClear($buffer, 0xFF000000)

    [/autoit]

    E

  • Es funktioniert übrigens auch so:

    [autoit]

    _GDIPlus_GraphicsDrawImageRectRect($buffer, $bk, $x, $y, 431, 400, 0, 0, 832, 800)

    [/autoit]

    Hier das Beispiel, was genau _GDIPlus_GraphicsDrawImageRectRect macht:
    Cursortasten zum bewegen; F1 - F4 zum ändern der Größe

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $iX = 0
    $iY = 0
    $iW = 100
    $iH = 100

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

    HotKeySet("{UP}", "_Move")
    HotKeySet("{DOWN}", "_Move")
    HotKeySet("{LEFT}", "_Move")
    HotKeySet("{RIGHT}", "_Move")
    HotKeySet("{F1}", "_Size")
    HotKeySet("{F2}", "_Size")
    HotKeySet("{F3}", "_Size")
    HotKeySet("{F4}", "_Size")

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

    _GDIPlus_Startup()

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

    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\back.png")

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

    $hGui_SRC = GUICreate("Quelle", 431, 400, 0, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    $hGFX_SRC = _GDIPlus_GraphicsCreateFromHWND($hGui_SRC)
    $hBMP_SRC_Buf = _GDIPlus_BitmapCreateFromGraphics(431, 400, $hGFX_SRC)
    $hGFX_SRC_Buf = _GDIPlus_ImageGetGraphicsContext($hBMP_SRC_Buf)
    GUISetState()

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

    $hGui_DST = GUICreate("Ziel", 200, 200, 450, 0)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    $hGFX_DST = _GDIPlus_GraphicsCreateFromHWND($hGui_DST)
    $hBMP_DST_Buf = _GDIPlus_BitmapCreateFromGraphics(200, 200, $hGFX_DST)
    $hGFX_DST_Buf = _GDIPlus_ImageGetGraphicsContext($hBMP_DST_Buf)
    GUISetState()

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

    $hPen = _GDIPlus_PenCreate(0xFFFF4040, 1)
    _Draw()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Draw()
    _GDIPlus_GraphicsClear($hGFX_SRC_Buf, 0xFF000000)
    _GDIPlus_GraphicsDrawImage($hGFX_SRC_Buf, $hImage, 0, 0)
    _GDIPlus_GraphicsDrawRect($hGFX_SRC_Buf, $iX, $iY, $iW, $iH, $hPen)
    _GDIPlus_GraphicsDrawImage($hGFX_SRC, $hBMP_SRC_Buf, 0, 0)

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

    _GDIPlus_GraphicsClear($hGFX_DST_Buf, 0xFF000000)
    _GDIPlus_GraphicsDrawImageRectRect($hGFX_DST_Buf, $hImage, $iX, $iY, $iW, $iH, 0, 0, 200, 200)
    _GDIPlus_GraphicsDrawImage($hGFX_DST, $hBMP_DST_Buf, 0, 0)
    EndFunc ;==>_Draw

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

    Func _Move()
    Switch @HotKeyPressed
    Case "{UP}"
    $iY -= 1
    Case "{DOWN}"
    $iY += 1
    Case "{LEFT}"
    $iX -= 1
    Case "{RIGHT}"
    $iX += 1
    EndSwitch
    _Draw()
    EndFunc ;==>_Move

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

    Func _Size()
    Switch @HotKeyPressed
    Case "{F1}"
    $iW -= 1
    Case "{F2}"
    $iW += 1
    Case "{F3}"
    $iH -= 1
    Case "{F4}"
    $iH += 1
    EndSwitch
    _Draw()
    EndFunc ;==>_Size

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

    Func _Exit()
    _GDIPlus_PenDispose($hPen)

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

    _GDIPlus_ImageDispose($hImage)

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

    _GDIPlus_GraphicsDispose($hGFX_DST_Buf)
    _GDIPlus_BitmapDispose($hBMP_DST_Buf)
    _GDIPlus_GraphicsDispose($hGFX_DST)

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

    _GDIPlus_GraphicsDispose($hGFX_SRC_Buf)
    _GDIPlus_BitmapDispose($hBMP_SRC_Buf)
    _GDIPlus_GraphicsDispose($hGFX_SRC)

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

    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E