Hallo Leute,
ich habe da mal wieder ein kleines Problem. Ich habe ein kleines Programm geschrieben, dass Bilder aus einem Ordner lädt und diese dann mit einer kleinen Animation anzeigen soll. Das läuft in der aktuellen Version eingentlich auch alles sehr gut außer dass das Programm extrem viel Speicher zieht.
Gibt es eine Möglichkeit die gleiche Animation zu erhalten, aber ohne soooo viel Speicherplatz?
Hier noch der bisherige Quelltext:
C
#include <File.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
$high=@DesktopHeight/5
$Form1 = GUICreate("Form1", @DesktopWidth, @DesktopHeight, 0, 0, BitOR($WS_POPUP,$DS_SETFOREGROUND), $WS_EX_TOPMOST)
GUISetBkColor(0x000000)
GUISetState(@SW_SHOW)
_GDIPlus_Startup()
$hImage = _GDIPlus_GraphicsCreateFromHWND($Form1)
Sleep(2000)
$pics=_FileListToArray(@Scriptdir&"\Pics","*.*",1)
_ArrayDelete($pics,0)
Dim $pichandles[Ubound($pics)]
Dim $picnamen [Ubound($pics)]
Dim $used [Ubound($pics)]
For $t=0 To Ubound($pics)-1
$pichandles[$t]= _GDIPlus_ImageLoadFromFile(@Scriptdir&"\Pics\"&$pics[$t])
$used [$t]= false
$picnamen [$t]= $pics[$t]
Next
While 1
If GUIGetMsg()=$GUI_EVENT_CLOSE Then
_GDIPlus_Shutdown()
Exit
Endif
;Bilder anzeigen
$nr=Random(0,Ubound($pichandles)-1,1)
showpic($pichandles[$nr],300,300,$high,$high,true)
delpic($pichandles[$nr],300,300,$high,$high,true)
WEnd
Func showpic($pichandle,$posx,$posy,$picwith,$pichigh,$fast)
If $fast Then
For $t=0 To $picwith
_GDIPlus_GraphicsDrawImage($hImage,Scale_Image($pichandle, $t, $pichigh), $posx+($picwith/2)-($t/2), $posy)
Next
Else
For $t=0 To $picwith
_GDIPlus_GraphicsDrawImage($hImage,Scale_Image($pichandle, $t, $pichigh), $posx+($picwith/2)-($t/2), $posy)
Sleep(5)
Next
Endif
EndFunc
Func delpic($pichandle,$posx,$posy,$picwith,$pichigh,$fast)
If $fast Then
For $t=0 To $picwith
_GDIPlus_GraphicsDrawImage($hImage,Scale_Image($pichandle, $picwith-$t, $pichigh), $posx+($t/2), $posy)
Next
Else
For $t=0 To $picwith
_GDIPlus_GraphicsDrawImage($hImage,Scale_Image($pichandle, $picwith-$t, $pichigh), $posx+($t/2), $posy)
Sleep(15)
Next
Endif
EndFunc
Func _ArrayCompare($avArray1, $avArray2)
; Array[0] = Anzahl an Treffer
Local $avArray3[1] = [0], $iMax, $i
For $i = 0 To UBound($avArray1) - 1
If Not _c($avArray2, $avArray1[$i]) Then
$iMax = UBound($avArray3)
ReDim $avArray3[$iMax + 1]
$avArray3[$iMax] = $avArray1[$i]
EndIf
Next
$avArray3[0] = UBound($avArray3) - 1
Return $avArray3
EndFunc
Func _c($a, $v)
Local $i
For $i = 0 To UBound($a) - 1
If $a[$i] = $v Then Return True
Next
Return False
EndFunc
Func Scale_Image($hImage, $newW, $newH)
Local $newImage = _GDIPlus_BitmapCreateFromScan0($newW, $newH)
Local $hContext = _GDIPlus_ImageGetGraphicsContext($newImage)
_GDIPlus_GraphicsSetInterpolationMode($hContext, 7)
_GDIPlus_GraphicsDrawImageRect($hContext, $hImage, 0, 0, $newW, $newH)
_GDIPlus_GraphicsDispose($hContext)
Return SetError(0, 0, $newImage)
EndFunc
Func _GDIPlus_GraphicsSetInterpolationMode($hGraphics, $iInterpolationMode)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "hwnd", $hGraphics, "int", $iInterpolationMode)
If @error Then Return SetError(@error, @extended, False)
Return $aResult[0] = 0
EndFunc ;==>_GDIPlus_GraphicsSetInterpolationMode
Func _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", $iStride, "int", $iPixelFormat, "ptr", $pScan0, "int*", 0)
If @error Then Return SetError(@error, @extended, 0)
Return $aResult[6]
EndFunc ;==>_GDIPlus_BitmapCreateFromScan0
Alles anzeigen