Bild mit GdiMatrix drehen - Es fehlen danach Pixel am Rand

  • Hallo
    Ich habe folgendes Skript:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    _GDIPlus_Startup()

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

    $hGui = GUICreate("Test Rotate", 800, 600)
    GUISetState()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)

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

    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir& "\test.png")
    $RotatedImage=_ImageRotateFromLeft($hGraphic,800,600,$hImage,"Right")

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

    _GDIPlus_GraphicsDrawImage($hGraphic,$RotatedImage,0,0)
    While GUIGetMsg() <> -3
    Sleep(10)
    WEnd
    _GDIPlus_ImageDispose($RotatedImage)
    _GDIPlus_Shutdown()

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

    Func _ImageRotateFromLeft($iGraphic,$iGraphicW,$iGraphicH,$iImage,$iRotateTo)
    Local $iBitmap = _GDIPlus_BitmapCreateFromGraphics($iGraphicW,$iGraphicH,$iGraphic),$iGDI_Buffer = _GDIPlus_ImageGetGraphicsContext($iBitmap)
    Local $iWidth = _GDIPlus_ImageGetWidth($iImage),$iHeight = _GDIPlus_ImageGetHeight($iImage),$iMatrix = _GDIPlus_MatrixCreate()
    Local $iX = 0, $iY = 0
    Switch $iRotateTo
    Case "Down"
    _GDIPlus_MatrixTranslate($iMatrix,0,$iHeight-1)
    _GDIPlus_MatrixRotate($iMatrix, 270, False)
    ;$iX = 0
    ;$iY = 0
    Case "Right"
    _GDIPlus_MatrixTranslate($iMatrix,$iWidth,$iHeight)
    _GDIPlus_MatrixRotate($iMatrix, 180, False)
    $iX = 0
    $iY = 0
    Case "Top"
    _GDIPlus_MatrixTranslate($iMatrix,$iHeight,0)
    _GDIPlus_MatrixRotate($iMatrix, 90, False)
    EndSwitch
    _GDIPlus_GraphicsSetTransform($iGDI_Buffer, $iMatrix)
    _GDIPlus_GraphicsDrawImage($iGDI_Buffer,$iImage,$iX,$iY)
    _GDIPlus_MatrixDispose($iMatrix)
    _GDIPlus_GraphicsDispose($iGDI_Buffer)
    Return $iBitmap
    EndFunc

    [/autoit]


    Nur leider fehlt nach dem Drehen mit eine ganze Zeile/Spalte Pixel nach dem Drehen!? Der Fehler liegt an MatrixRotate, weil danach dieser Fehler auftritt. Weiß einer von euch woran das liegt?
    Vielen Dank für euerer Bemühen
    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug

  • Ist mir vorher noch nie aufgefallen!

    Wenn du immer genau in 90° Schritten drehen willst, dann benutze die Funktion _GDIPlus_ImageRotateFlip aus GDIp.au3, damit bleiben alle Pixel erhalten.

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include "GDIP.au3"
    _GDIPlus_Startup()

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

    $hGui = GUICreate("Test Rotate", 800, 600)
    GUISetState()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)

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

    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Test.png")
    _GDIplus_ImageRotateFlip($hImage, 2)

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

    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
    While GUIGetMsg() <> -3
    Sleep(10)
    WEnd
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

    [/autoit]


    E