www.mikrocontroller.net

Forum: PC-Programmierung Schnelle 2D Animationen, welches Programm?


Autor: Weinga-Unity (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Simulation, die schreibt zu jedem Zeitpunkt in eine Datei 
mit fortlaufender Nummer (z.B. CSV Format) den aktuellen Zustand der 
Simulation. Diese Datei lese ich derzeit je Bild in POVRAY ein und 
erzeuge so wunderschöne Animationen.

Problem ist, dass POVRAY zwar schöne 3D Bildchen macht, aber sehr 
langsam ist, und die Videogenerierung von ca. 7h sehr langweilig ist. Es 
reichen jedoch 2D Animationen die aus einigen Rechtecken und Linien 
bestehen. Ich möchte jedoch verhindern eine eigene BMP/PNG Ausgabe der 
Simulation direkt hinzuzufügen.

Nun meine Frage:
a) Gibt es ein Programm, das scriptartig Bilder erzeugen kann (z.B. BMP) 
und dabei die Daten für die Linien, Rechtecke, usw. aus separaten 
Dateien kommen können (vergleichbar mit POVRAY von der Verwendung wäre 
schon super).

b) Alternativ könnte ich mir auch noch vorstellen eine fertige C/C++ 
Bibliothek (soll mindestens unter WIN32+LINUX funktionieren) zu 
verwenden, die ca. folgende Art der Bilderzeugung ermöglicht:
   Bild *bild=new Bild(640,480);
   bild->setColor(0,0,1);
   bild->line(0,0,100,100);
   bild->rect(..);
   ...
   bild->saveAsBmp(filename);


Hat jemand Vorschläge bzw. kennt jemand eine fertige Lösung für Fall a) 
bzw. Fall b) (wenn möglich in Richtung kostenlos, OpenSource, GPL oder 
ähnliches)

Danke an Alle,
Weinga-Unity

Autor: Joerg Wolfram (joergwolfram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter Linux kann ich Dir die GD Library empfehlen, ein kleines Programm 
in Perl als Parser für die Kommandos und fertig. Alternativ dazu 
ImageMagick. Wie es damit bei Win32 aussieht - keine Ahnung.

Jörg

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BMP-Ausgabe ist aus C/C++ sehr trivial. Zwei Header hintereinander mit 
fwrite reinkopieren, dann das Bild zeilenweise Blau-Grün-Rot, am Ende 
der Zeile auf ganze DWords gepaddet.

Die Header sind structs namens BITMAPFILEHEADER und BITMAPINFOHEADER und 
sind unter Win32 in der windows.h vorhanden, ums unter Linux zu 
compilieren baust du dir einen eigenen Header, in den du die 
reinkopierst.

Infos findest du wenn du nach den beiden Typen googlest. So ists auf 
jeden Fall portabel. Nachteil: du kannst nur Pixel setzen, für alles 
abstraktere brauchst du doch wieder ne Library oder musst es selbst 
machen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weinga-Unity schrieb:

>
> b) Alternativ könnte ich mir auch noch vorstellen eine fertige C/C++
> Bibliothek (soll mindestens unter WIN32+LINUX funktionieren) zu
> verwenden, die ca. folgende Art der Bilderzeugung ermöglicht:
>    Bild *bild=new Bild(640,480);
>    bild->setColor(0,0,1);
>    bild->line(0,0,100,100);
>    bild->rect(..);
>    ...
>    bild->saveAsBmp(filename);

Ich schätze mal, dass du sowas für Windows nur schwer kriegen wirst, 
weil man das in Windows so eigentlich nicht macht.
Der Windows Weg wäre:
Bitmap erzeugen, Bitmap in einen Memory Device Context selektieren und 
dann mit dem kompletten Vorrat an GDI-Zeichenfunktionen in diesen Device 
Context malen wie man lustig ist.

(Die Bitmap ist dann für die Windows GDI Funktionen einfach nur ein 
'Ausgabegerät' in dem das GDI Pixel setzt. Insofern unterscheidet sich 
die Bitmap dadurch in nichts von einer Graphikkarte oder einem Drucker, 
Ausgabefläche ist Ausgabefläche)

Vielleicht hat das jemand so wir du dir das vorstellst für C/C++ in eine 
Library gekapselt, ich kann mir das aber ehrlich gesagt nicht wirklich 
vorstellen (viel Arbeit an Zeichenfunktionen für nichts).
Wobei du allerdings gute Chancen hättest, denn die gibt es wirklich wie 
Sand am Meer: Libraries, die dir ein Bitmap mit bestimmten Eigenschaften 
erzeugen und sich auch um die Speicherung in einem bestimmten Format 
kümmern.

Autor: Walter Tarpan (nicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ImageMagick ist auch unter Win verfügbar; wenn auch mit ein paar 
lustigen Nebenwirkungen (der Windows-Befehl "convert" sollte vor der 
Installation umbenannt werden, den braucht eh keiner).

Ich mache soetwas allerdings immer mit Matlab (keine Toolbox notwendig).

Autor: Weinga-Unity (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den libGD Hinweis. Habs auch bereits zum Kompilieren gebracht 
(nachdem ich noch libpng und zlib hinzugefügt habe). Ich werde es mal 
testen wie die Bildchen so werden und ob genügend Zeichenfunktionen zur 
Verfügung stehen. Ansonst genau das was ich gesucht habe.

Wer noch weitere Ideen hat, her damit (der 3D Fall ist dabei auch nicht 
ausgeschlossen).

mfg Weinga-Unity

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Ich schätze mal, dass du sowas für Windows nur schwer kriegen wirst,
> weil man das in Windows so eigentlich nicht macht.
Wieso nicht? Nicht immer nur in WinAPIs denken ;)

Bitte schön hier ein Beispiel in Java, läuft auch unter Windows:
public static void generateImage() throws IOException {
  BufferedImage image = new BufferedImage(640, 480,
      BufferedImage.TYPE_INT_ARGB);
  
  Graphics2D canvas = (Graphics2D) image.getGraphics();
  canvas.setColor(new Color(0,0,1));
  canvas.drawLine(0, 0, 100, 100);
  canvas.drawRect(20, 30, 80, 90);
  //
  //
  //
  canvas.dispose();
  ImageIO.write(image, "png", new File("test.png"));
}
Graphics2D kann sogar noch komplexe "Shapes" wie Pfade etc. zeichnen 
wenn man das braucht, habe damit mal einen SVG Renderer geschrieben.
Läuft auf Linux, Windows, MaxOS... erzeugt schöne transparente PNGs, für 
BMP einfach BufferedImage.TYPE_INT_ARGB durch BufferedImage.TYPE_INT_RGB 
ersetzen, und das format von "png" nach "bmp" (Achtung die Zeichenfläche 
ist defaultmäßig Schwarz also dann ggf einmal ein gefülltes Rechteck in 
Weiß zeichnen).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läubi .. schrieb:
> Karl heinz Buchegger schrieb:
>> Ich schätze mal, dass du sowas für Windows nur schwer kriegen wirst,
>> weil man das in Windows so eigentlich nicht macht.
> Wieso nicht? Nicht immer nur in WinAPIs denken ;)
>
> Bitte schön hier ein Beispiel in Java, läuft auch unter Windows:

Die Rede war aber von einer C/C++ Lib.
Ist vielleicht nicht so deutlich herausgekommen, dass die Antwort darauf 
gemünzt war.


public static void generateImage() throws IOException {
  BufferedImage image = new BufferedImage(640, 480,
      BufferedImage.TYPE_INT_ARGB);
  
  Graphics2D canvas = (Graphics2D) image.getGraphics();

Ähm. Ist das nicht das gleiche Prinzip? Ob ich das Teil jetzt canvas 
oder device context nenne, ist doch völlig egal.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Die Rede war aber von einer C/C++ Lib.
Hm...habich überlesen das der TE auf C fixiertist..

> Ähm. Ist das nicht das gleiche Prinzip? Ob ich das Teil jetzt canvas
> oder device context nenne, ist doch völlig egal.
Ich wollte nur zeigen das man sich unter java halt einfach ein "Bild" 
holen kann. und dann darauf wievom TE gewünscht 'malen'

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
a) hier würde ich ImageMagick verwenden:
http://www.imagemagick.org/script/command-line-opt...

b) wxWidgets
http://docs.wxwidgets.org/stable/wx_wxmemorydc.htm...
Mit wxWidgets kannst du auch gleich eine schöne GUI basteln.

c) Rendering direkt auf den Bildschirm mit einer Multimedia Lib
http://www.sfml-dev.org/index.php

Alle Lösungen sind  für Win+Linux, wobei du ImageMagick auch irgendwie 
steuern musst.

Autor: Tom Ekman (tkon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.. und zum Abspeichern kannst das "SVG" Format verwenden.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

http://www.antigrain.com

Für den einfachen Einstieg:
http://antigrain.com/stuff/Agg2D.zip

Erfordert etwas Einarbeitung, insbesondere wenn man die agg über die 
Möglichkeiten der AGG2D Kapselung hinaus verwenden will. Ist dann aber 
ein extrem mächtiges 2D Grafikwerkzeug.

Außerdem zeigt die Bibliothek was man außer std::vector & Co. noch so 
alles mit C++ templates anstellen kann ;-)

Matthias

Autor: Weinga-Unity (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@matthias:

also die Bibliothek gibt anscheinend ordentlich was her. Sogar 
Eingabemöglichkeiten sind vorhanden (geht auch Texteingabe?). Die LIB 
würde sich ja ideal für Interaktive Simulationen und Visualisierungen 
anbieten. Bin jetzt wirklich am Überlegen, ob ich diese verwenden soll.

Was ich jetzt auf die Schnelle nicht gefunden habe: kann man die Bilder 
in Dateien abspeichern?

Für die Einfachere Bedienung aus der Simulation heraus müsste ich jetzt 
noch das ganze kapseln, aber das muss ich mir noch anschauen. Was an 
libGD nett ist, ist die Einfachheit. AGG jedoch ist durch die direkte 
Bildschirmausgabe und Interaktionsmöglichkeiten doch sehr verlockend.

mfg Weinga-Unity

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.