Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   BMP (Bitmap) Animator (https://www.delphipraxis.net/135030-bmp-bitmap-animator.html)

Tropby 3. Jun 2009 14:00


BMP (Bitmap) Animator
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der BMP (Bitmap) Animator

Aktuelle Version : 0.3

Da häufig mal verlangt wurde, dass es kleine Animationen in Programmen geben sollte und ich da keine Lust hatte mir immer was neues einfallen zu lassen habe ich diese Unit geschrieben.


Diese Unit ist im Stande ein Format, ich habe es jetzt mal ".anibmp" genannt, einzulesen und die Bilddaten zu animieren. In dieser Version der Unit fehlen noch ein paar Fehlerabfragen jedoch ist sie so schon in einigen Programmen getestet. Da die Zeitberechnung der Animation in einen Thread ausgelagert ist und die Callback-Funktion nur einen Pointer zu den Bilddaten bekommt, ist die Animation, wenn man sie noch mit Hier im Forum suchenBitBlt benutzt, auch bei schnellen Animationen flüssig. Wie das ganze aussieht wenn viele Animationen zur gleichen Zeit laufen habe ich noch nicht getestet.


Mit einem beiligendem Tool namens "BMP Animator.exe" können diese ".anibmp"-Dateien erstellt werden. Als Ausgangsbasis dienen hierbei normale Bitmaps. Der "BMP Animator" kann auch die erstellten Dateien sofort abspielen um zu sehen ob Fehler aufgetreten sind.


Die Klasse kann:
  1. Animationen abspielen
  2. Animationen pausieren
  3. Animationen rückwärtsablaufen lassen

Funktions-Beschreibungen

Constructor:
Delphi-Quellcode:
constructor TAniBMP.Create(); Overload;
Dies sind die Constructor der TAniBMP-Class.

Animation Laden:
Delphi-Quellcode:
procedure TAniBMP.LoadFromFile(const Filename : String);
procedure TAniBMP.LoadFromStream(const Stream : TStream);
Hiermit kann die Animation die das Objekt machen soll geändert werden.

Einen Frame Extrahieren:
Delphi-Quellcode:
function TAniBMP.GetFrame(FrameID : Integer; var bmp : TBitmap) : Integer;
Wenn die Funktion erfolgreich ist liefert sie 0 zurück und bmp ist mit dem angegeben Frame gefüllt.

Animation starten:
Delphi-Quellcode:
function TAniBMP.start(CallbackID : Integer = 0) : Boolean;
Startet die Animation mit der angegeben CallbackID.

Animation stoppen:
Delphi-Quellcode:
procedure TAniBMP.stop(CallbackID : Integer = 0);
Stoppt die Animation mit der angegeben CallbackID.


Animation stoppen:
Delphi-Quellcode:
procedure TAniBMP.pause(Pause : Boolean; CallbackID : Integer = 0);
function TAniBMP.IstPausiert(CallbackID : Integer = 0) : Boolean;
Pausiert eine Animation.


Eigenschafts-Beschreibungen

Delphi-Quellcode:
TAniBMP.OnAnimate = procedure(ID : Integer; P: Pointer);
OnAnimate wird für jedes Frame aufgerufen.
  • P ist ein Pointer zu dem Bitmap
  • ID ist die CallbackID der Animation


Delphi-Quellcode:
TAniBMP.Interval : Integer;
Zeit in Millisekunden in denen die Frames geredert werden sollen.


Delphi-Quellcode:
TAniBMP.StartFrame : Integer;
Das erste Frame, des zu der Animation gehört.


Delphi-Quellcode:
TAniBMP.EndFrame : Integer;
Das letzte Frame, des zu der Animation gehört.


Delphi-Quellcode:
TAniBMP.AnzFrames : Integer; (readonly)
Anzahl der Frames, die die Animation besitzt.


Delphi-Quellcode:
TAniBMP.Backward : Boolean;
Soll die Animation vorwärts oder rückwärts abgespielt werden?
TRUE = Rückwärts


Delphi-Quellcode:
TAniBMP.Exceptions : Boolean;
Sollen Execptions ausgegeben werden.


Delphi-Quellcode:
TAniBMP.LastError : String;
Last Error beinhaltet die letzte Errornachricht.
Ist ganz nützlich wenn Exceptions ausgeschaltet sind.


Changelog:

Version 0.3
  • Der Klasse Eigenschaften hinzugefügt und dafür die Übergabeparameter aus der Startfunktion entfernt
  • Die Callbackfunktion heißt nun TAniBMP.OnAnimate
  • Einige Funktionen umbenannt da die Benennungen unsinig waren
  • Animationen können Rückwärts abgespielt werden (TAniBMP.Backward : Boolean;).
  • Mehr als eine Animation sind nun möglich. Dazu kommt auch noch, dass alle Animationen mit verschiedenen Eigendschaften gestartet werden können.


Version 0.2
  • Erste veröffendlichung


Ich habe die Unit gestestet und zur Zeit keine Fehler gefunden (Rechtschreibfehler ausgenommen).
Trotzdem kann ich nicht garantieren, dass es Fehler gibt und es zu Datenverlust führen kann :P

Blup 3. Jun 2009 16:05

Re: BMP (Bitmap) Animator
 
Die Klasse TAniBMP hat zwei Aufgaben, die meiner Ansicht in zwei getrennte Klassen getrennt gehören.

Verwalten/Bereitstellen der Bilddaten, dazu gehört:
- Laden
- Hinzufügen und Entfernen einzelner Bilder (fehlt)
- Speichern (fehlt)

Hier könnte man überlegen, ob das Dateiformat in dieser Form sinnvoll ist.
Zumindest Bilder gleicher Größe und Farbtiefe kann man gut auch in einer großen Bitmap unterbringen.
Alternativ könnte man auch lediglich das Anfangsbild und für jedes folgende nur die Differenzinformationen speichern.
Das lässt sich sehr gut komprimieren.


Erstellen einer Animation, dazu gehört:
- Parameter setzen
- Starten und Stoppen

Wenn zum Beispiel zwei getrennte Animationen mit den selben Bilddaten laufen sollen (z.B. 2 Männchen), müssen die Bilddaten nicht unbedingt auch mehrfach geladen werden.


Die Funktion Start_Animation enthält Default-Parameter die zu einer Exception führen.
An dieser Stelle würde ich eher mit Property arbeiten und auf Parameter verzichten.
(z.B. auch OnAnimation: TBitmapCallback)
Als Methodennamen würde Start, Stop genügen (was sollte ich sonst starten als die Animation).
Pause könnte auch ein read/write Property sein.

Tropby 3. Jun 2009 23:20

Re: BMP (Bitmap) Animator
 
Danke für deine Anregungen.
  • Die Klasse TAniBMP ist nur dafür zuständig, die Animation auszuführen. Eine Klasse um ein Bild zu erstellen habe ich noch nicht geschrieben xD das ist bis jetzt nur eine Funktion.
  • Ein großes BMP zu erstellen ist auch eine idee :gruebel:
    Sollte ich vielleicht nochmal drüber nachdenken. Aber soll ich dann der callback noch ein RECT mitgeben das dann den Frame darstellt in dem BMP?
  • Die Differenzinformationen speichern ist leider nicht so einfach umzusetzten dabei :spin2: Weil so eine Animation ja auch nur Teilweise ablaufen können soll und wie soll dann das Ausgangsbild entstehen?
  • Animationen doppelt starten habe ich auch schon auf meinem Zettel stehen um dabei Platz zu sparen ^^
  • Die Parameter in der Funktion kommen noch daher da das ganze am anfang keine Klasse war :angel2: als ich angefangen habe war das ganze in Funktionen untergebracht.
    Diesen Teil der Klasse muss ich wohl nochmal komplett überarbeiten.

Satty67 3. Jun 2009 23:52

Re: BMP (Bitmap) Animator
 
ist jetzt vielleicht ungerecht damit zu kommen...
...aber für eine Animation in meinem kleinen Backupprogramm:

Verwendete ein kleines Tool bmp2avi um aus Windows-Bitmaps ein AVI zu erzeugen. Naja und dann halt die Standard-Komponente TAnimate. AVIs sind dann auch recht klein und problemlos als Ressource einzubinden gewesen.

Tropby 4. Jun 2009 15:50

Re: BMP (Bitmap) Animator
 
Hallo,

ich habe die Klasse nochmal komplett überarbeitet und noch ein paar schöne kleine Funktionen hinzugefügt.
  • Mehr als eine Animation startbar
  • Eigenschaften statt Parameter
  • und viele kleine andere änderungen...


@Satty67:
Ich habe vor in diese Klasse noch mehr möglichkeiten einzubauen. So, dass man sie nachher auch für mehr sachen benutzten kann.
Mit der Standard-Komponente TAnimate habe ich da immer so meine Probleme ^^ die macht das nie so wie ich das genau will

xZise 6. Jun 2009 22:26

Re: BMP (Bitmap) Animator
 
Hallo, ich habe deine Klasse jetzt nicht getestet, aber ich würde mich für eine Sprache (englisch) entscheiden :P

Also statt "IstPausiert" einfach "Paused" und "AnzFrames" dann "FrameCount".

MfG
xZise


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz