Rotation in GDI+

  • Moin,

    Habe ein ganz banales Problem (und stehe vermutlich auf einem der vielen möglichen Schläuche).

    Ich möchte ein Bild in GDI+ Rotieren lassen.
    Und zwar um seinen Mittelpunkt.

    Daneben gibt es leider noch ein paar kleinere Problemchen.
    Die Kantenglättung funktioniert innerhalb des Bildes wie gewünscht, aber der obere Rand ist sehr verpixelt.
    Seltsamerweise ist der andere Rand korrekt interpoliert.

    Screenshots:
    Normal
    [Blockierte Grafik: http://i.imgur.com/ZOSX4.png]
    400% Zoom
    [Blockierte Grafik: http://i.imgur.com/OLQqh.png]

    "Skript"
    [autoit]


    Opt('GUICloseOnESC', 0)
    Opt('GUIOnEventMode', 1)
    Opt('MustDeclareVars', 1)
    Opt('MouseCoordMode', 2)

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

    #include <GDIPlus.au3>

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

    Global $hGUI, $hBuf, $hGFX, $hBMP, $hMatrix, $hImg

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

    _GDIPlus_Startup()

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

    $hGUI = GUICreate('Test', 400, 400)

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

    $hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBMP = _GDIPlus_BitmapCreateFromGraphics(400, 400, $hGFX)
    $hBuf = _GDIPlus_ImageGetGraphicsContext($hBMP)

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

    _GDIPlus_GraphicsSetSmoothingMode($hBuf, 2)
    _GDIPlus_GraphicsSetSmoothingMode($hGFX, 2)

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

    $hMatrix = _GDIPlus_MatrixCreate()

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

    $hImg = _GDIPlus_ImageLoadFromFile('unnamed.png')

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

    GUISetOnEvent(-3, '_Exit', $hGUI)
    GUIRegisterMsg(0xF, 'WM_PAINT')
    OnAutoItExitRegister('_Freigeben')
    GUISetState(@SW_SHOW, $hGUI)

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

    While Sleep(100)
    _Rotieren()
    WM_PAINT()
    WEnd

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

    Func _Rotieren()

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

    Local Static $iDeg = 0
    $iDeg += 1 - ($iDeg > 359)*359

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

    _GDIPlus_GraphicsClear($hBuf, 0xFF000000)

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

    _GDIPlus_MatrixRotate($hMatrix, 1)

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

    _GDIPlus_GraphicsSetTransform($hBuf, $hMatrix)
    _GDIPlus_GraphicsDrawImage($hBuf, $hImg, 0, 0)

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

    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImage($hGFX, $hBMP, 0, 0)
    EndFunc

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

    Func _Freigeben()

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

    _GDIPlus_MatrixDispose($hMatrix)

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

    _GDIPlus_GraphicsDispose($hGFX)
    _GDIPlus_GraphicsDispose($hGFX)
    _GDIPlus_BitmapDispose($hBMP)

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

    _GDIPlus_Shutdown()
    EndFunc

    [/autoit]


    Edit:
    Hab herausgefunden wie man es mittig dreht (Forensuche lässt grüßen. Man braucht nur die richtigen Suchbegriffe...).
    Das Problem mit den Kanten besteht weiterhin.

    Edit2: Problem gelöst.