AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte BMP (Bitmap) Animator

BMP (Bitmap) Animator

Ein Thema von Tropby · begonnen am 3. Jun 2009 · letzter Beitrag vom 6. Jun 2009
Antwort Antwort
Tropby
Registriert seit: 4. Dez 2006
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:
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:
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:
function TAniBMP.start(CallbackID : Integer = 0) : Boolean; Startet die Animation mit der angegeben CallbackID.

Animation stoppen:
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

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


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


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


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


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


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


TAniBMP.Exceptions : Boolean; Sollen Execptions ausgegeben werden.


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
Angehängte Dateien
Dateityp: zip bmp_animator_v0.3_186.zip (837,0 KB, 52x aufgerufen)
 
Blup

 
Delphi 10.4 Sydney
 
#2
  Alt 3. Jun 2009, 16:05
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.
  Mit Zitat antworten Zitat
Tropby
 
#3
  Alt 3. Jun 2009, 23:20
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
    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 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 als ich angefangen habe war das ganze in Funktionen untergebracht.
    Diesen Teil der Klasse muss ich wohl nochmal komplett überarbeiten.
  Mit Zitat antworten Zitat
Satty67

 
Delphi 2007 Professional
 
#4
  Alt 3. Jun 2009, 23:52
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.
  Mit Zitat antworten Zitat
Tropby
 
#5
  Alt 4. Jun 2009, 15:50
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
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#6
  Alt 6. Jun 2009, 22:26
Hallo, ich habe deine Klasse jetzt nicht getestet, aber ich würde mich für eine Sprache (englisch) entscheiden

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

MfG
xZise
Fabian
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 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