Bild als drehende Spirale

  • Eine kleine Spielerei

    Spoiler anzeigen
    [autoit]

    #include <GDIP.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

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

    HotKeySet("{ESC}", "_EXIT")

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

    $sFile = FileOpenDialog("Öffnen", "", "(*.jpg;*.bmp;*.png;*.tif)")
    If @error Or Not $sFile Or Not FileExists($sFile) Then Exit

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

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile($sFile)
    If @error Or Not $hImage Then Exit

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

    $iWidth = _GDIPlus_ImageGetWidth($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage)

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

    _ResizeImage($hImage, $iWidth, $iHeight, @DesktopWidth * 0.7, @DesktopHeight * 0.7)

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

    $hGui = GUICreate("Test", $iWidth, $iHeight, Default, Default, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_LAYERED, $WS_EX_TRANSPARENT))
    GUISetState()

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

    $hPath = _CreateSpiralPath($iWidth, $iHeight, 2, 1.06, 0.05)
    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, $iWidth / 2, $iHeight / 2)
    _GDIPlus_MatrixRotate($hMatrix, -12)
    _GDIPlus_MatrixTranslate($hMatrix, -$iWidth / 2, -$iHeight / 2)

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

    While 1
    _DrawImage($hGui, $hImage, $hPath, $hMatrix, $iWidth, $iHeight)
    Sleep(10)
    WEnd

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

    Func _ResizeImage(ByRef $hImage, ByRef $iWidth, ByRef $iHeight, $iNewWidth, $iNewHeight)
    Local $fScaleX = $iNewWidth / $iWidth
    Local $fScaleY = $iNewHeight / $iHeight
    If $fScaleY < $fScaleX Then $fScaleX = $fScaleY

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

    $iWidth *= $fScaleX
    $iHeight *= $fScaleX
    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())
    Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsDrawImageRect($hContext, $hImage, 0, 0, $iWidth, $iHeight)
    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_BitmapDispose($hImage)
    $hImage = $hBitmap
    EndFunc ;==>_ResizeImage

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

    Func _DrawImage($hWnd, $hImage, $hPath, $hMatrix, $iW, $iH)
    Local $tSize = DllStructCreate("long X;long Y")
    DllStructSetData($tSize, "X", $iW)
    DllStructSetData($tSize, "Y", $iH)
    Local $tSource = DllStructCreate("long X;long Y")
    Local $tBlendI = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
    DllStructSetData($tBlendI, "Alpha", 0xFF)
    DllStructSetData($tBlendI, "Format", 1)

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

    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphics)
    Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    _GDIPlus_PathTransform($hPath, $hMatrix)
    Local $hRegion = _GDIPlus_RegionCreateFromPath($hPath)
    _GDIPlus_GraphicsSetClipRegion($hContext, $hRegion)
    _GDIPlus_RegionDispose($hRegion)

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

    _GDIPlus_GraphicsDrawImage($hContext, $hImage, 0, 0)

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

    Local $hPen = _GDIPlus_PenCreate(0xFF000000, 3)
    _GDIPlus_GraphicsDrawPath($hContext, $hPath, $hPen)
    _GDIPlus_PenDispose($hPen)

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

    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_GraphicsDispose($hGraphics)

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

    Local $hDCD = _WinAPI_GetDC($hWnd)
    Local $hDCS = _WinAPI_CreateCompatibleDC($hDCD)
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    Local $hOrig = _WinAPI_SelectObject($hDCS, $hBmp)

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

    _WinAPI_UpdateLayeredWindow($hWnd, $hDCD, 0, DllStructGetPtr($tSize), $hDCS, DllStructGetPtr($tSource), 0, DllStructGetPtr($tBlendI), 2)

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

    _WinAPI_SelectObject($hDCS, $hOrig)
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_DeleteDC($hDCS)
    _WinAPI_ReleaseDC($hWnd, $hDCD)
    EndFunc ;==>_DrawImage

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

    Func _CreateSpiralPath($iW, $iH, $fSqr = 2, $fMul = 1.1, $fStep = 0.03)
    Local $hPath = _GDIPlus_PathCreate(0)
    Local $iCnt = 0, $iW2 = $iW / 2, $iH2 = $iH / 2
    Local $iX, $iY, $iXOld = $iW2, $iYOld = $iH2
    Do
    $iX = Cos($iCnt) * $iCnt ^ $fSqr + $iW2
    $iY = Sin($iCnt) * $iCnt ^ $fSqr + $iH2
    _GDIPlus_PathAddLine($hPath, $iXOld, $iYOld, $iX, $iY)
    $iXOld = $iX
    $iYOld = $iY
    $iCnt += $fStep
    Until ($iX < 0 Or $iX > $iW) And ($iY < 0 Or $iY > $iH)
    _GDIPlus_PathReverse($hPath)
    $iXOld = $iW2
    $iYOld = $iH2
    $fSqr *= $fMul
    For $i = 0 To $iCnt Step $fStep
    $iX = Cos($i) * $i ^ $fSqr + $iW2
    $iY = Sin($i) * $i ^ $fSqr + $iH2
    _GDIPlus_PathAddLine($hPath, $iXOld, $iYOld, $iX, $iY)
    $iXOld = $iX
    $iYOld = $iY
    Next
    _GDIPlus_PathCloseFigures($hPath)
    _GDIPlus_PathFlatten($hPath)
    Return $hPath
    EndFunc ;==>_CreateSpiralPath

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

    Func _EXIT()
    _GDIPlus_BitmapDispose($hImage)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_EXIT

    [/autoit]

    benötigt GDIp.au3

    E

  • Sau geil :thumbup:

    So langsam machst du UEZ Konkurrent :thumbup:

    Respekt :)

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]
  • eukalyptus: wieder was feines gezaubert... :thumbup:

    GE IXI TIM: ich sehe in Eukalyptus keinen Konkurrenten, sondern einen "Lehrer"! Er ist ja schon lange mit GDI+ dabei und wer in seinen Codes hineinschaut, kann eine Menge über die GDI+ "Kunst" lernen!

    "Und Konkurrenz belebt das Geschäft." wie man so schön sagt! :P

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • @ UEZ: So hab ich das nicht gemeint :D

    Hab mir das Skript mal angesehen in der Hoffnung was zu lernen...
    Aber ich raff davon vllt 15% ;(
    Naja ab zu den Anfänger-Tutorials...

    Ich stelle mir gerade ein Spiel vor, welches in Zusammenarbeit von UEZ und Eukalyptus erstellt wurde oO
    :thumbup:

    Ne wie schon gesagt: Super Skript :thumbup:

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]