Ich habe mal ein Beispiel geschrieben um mit GDI+ z.B. ein Intro Video das über die Möglichkeiten von GDI+ hinausgeht oder zu langsam zu zeichnen wäre für irgendein Programm abzuspielen.
Es gibt auch bestimmt andere Methoden um ein Video in einem AutoIt Fenster abzuspielen. Allerdings wollte ich es mit GDI+ aus 2 Gründen machen.
- Man kann mit dieser Methode auch eine Bilder Sequenz an einer bestimmten Position in einer bestimmten Größe auf einem bestimmten Hintergrund abspielen.
- Da das ganze mit GDI+ Funktioniert ist es perfekt für GDI+ basierte Scripts (z.B. Spiele).
Das besondere an meinem Beispiel ist, dass die Bilder mit einer exakten Framerate abgespielt werden und somit synchron zur Audiospur sind die möglicherweise im Hintergrund läuft. Die Methode mit AdlibRegister und 1000 / FPS die ich mal vorgeschlagen habe ist viel zu ungenau und die Video Sequenz teilweise 2 Sekunden zu früh fertig.
Mein Beispiel habe ich übrigens mit Adobe After Effects gemacht :P, es kann aber auch einfach eine Sequenz mit Bildern aus z.B. GIMP oder sogar MS Paint erstellt werden ;).
Beispiel
#include <GDIPlus.au3>
#include <GUIConstants.au3>
#include <File.au3>
#include <Sound.au3>
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]$iGUIWidth = 600
$iGUIHeight = 400
$FPS = 40
[/autoit] [autoit][/autoit] [autoit]$hWnd = GUICreate("Name22 Logo", $iGUIWidth, $iGUIHeight)
GUISetState()
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
Global $aLogo_Name22[1]
$aLogo_Name22[0] = 0
$iCurrentFrame = 1
$aSoundBG = _SoundOpen(@ScriptDir & "\Sounds\Logo_Name22 Soundtrack.mp3")
_LoadData()
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
[/autoit] [autoit][/autoit] [autoit]$iTimer = TimerInit()
_SoundPlay($aSoundBG)
AdlibRegister("_DrawFrame", 20)
While Sleep(1000)
WEnd
Func _DrawFrame()
_GDIPlus_GraphicsDrawImageRect($hBuffer, $aLogo_Name22[$iCurrentFrame], 0, 0, $iGUIWidth, $iGUIHeight)
$iCurrentFrame = Floor(TimerDiff($iTimer) / 1000 * $FPS)
If $iCurrentFrame >= $aLogo_Name22[0] Then
_Exit()
EndIf
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
EndFunc
Func _LoadData()
$aFilesTmp = _FileListToArray(@ScriptDir & "\Images\Logo_Name22", "*.png", 1)
If IsArray($aFilesTmp) Then
ReDim $aLogo_Name22[$aFilesTmp[0] + 1]
$aLogo_Name22[0] = $aFilesTmp[0]
For $i = 1 To $aLogo_Name22[0]
$aLogo_Name22[$i] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\Logo_Name22\" & $aFilesTmp[$i])
Next
EndIf
EndFunc
Func _Exit()
AdlibUnRegister()
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_BitmapDispose($hBitmap)
For $i = 1 To $aLogo_Name22[0]
_GDIPlus_ImageDispose($aLogo_Name22[$i])
Next
_GDIPlus_Shutdown()
_SoundClose($aSoundBG)
Exit
EndFunc
Die benötigten Dateien und das Script findet ihr hier oder hier...
Falls euch der Download zu groß ist, dann könnt ihr auch einfach ein paar eurer Bilder nehmen (ihr müsst im Grunde nur die Pfade anpassen).
Ich würde mich über konstruktive Kritik zum Script freuen ;). Eure Meinungen über meine After Effects Skills u.Ä. bitte für euch behalten :D.