Animation mit GDI+ und Bildern

  • 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:

  • Lade die Bilder nicht alle auf einmal in den Speicher, sondern speicher nur die Pfade zu den Bildern und lade die Bilder anschließend "on-the-fly".

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Na ja,

    [autoit]


    For $t = 0 To UBound($pics) - 1
    $pichandles[$t] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Pics\" & $pics[$t])
    $used[$t] = False
    $picnamen[$t] = $pics[$t]
    Next

    [/autoit]


    lädt doch alle Bilder in den Speicher. Das frisst deinen Speicher auf, wenn du viele Bilder hast.

    Du solltest, bevor du das Bild anzeigen willst, erst dann laden und anschließend wieder das Handle freigeben (Dispose).

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Das Problem ist: Selbst wenn ich alles auf den folgenden Umfang reduziere, zieht der immernoch so viel an Speicher, zwar etwas langsamer, aber immernoch viel...

  • Die Funktion

    [autoit]


    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 ;==>Scale_Image

    [/autoit]

    gibt einen Grafik Handle zurück, sodass dieser nach Benutzung wieder freigegeben werden muss. D.h. _GDIPlus_GraphicsDrawImage($hImage, Scale_Image(), ...) ist keine gute Idee, da bei jedem Aufruf das Bild zwar skaliert wird, aber die Ressourcen nicht wieder freigegeben werden.

    Am besten sowas machen:

    [autoit]


    For $t = 0 To $picwith
    $hBmp_Scaled = Scale_Image($pichandle, $t, $pichigh)
    _GDIPlus_GraphicsDrawImage($hImage, $hBmp_Scaled, $posx + ($picwith / 2) - ($t / 2), $posy)
    _GDIPlus_BitmapDispose($hBmp_Scaled)
    Next

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯