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


von Weinga-Unity (Gast)


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

von Joerg W. (joergwolfram)


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

von der mechatroniker (Gast)


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.

von Karl H. (kbuchegg)


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.

von Walter T. (nicolas)


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).

von Weinga-Unity (Gast)


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

von Läubi .. (laeubi) Benutzerseite


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:
1
public static void generateImage() throws IOException {
2
  BufferedImage image = new BufferedImage(640, 480,
3
      BufferedImage.TYPE_INT_ARGB);
4
  
5
  Graphics2D canvas = (Graphics2D) image.getGraphics();
6
  canvas.setColor(new Color(0,0,1));
7
  canvas.drawLine(0, 0, 100, 100);
8
  canvas.drawRect(20, 30, 80, 90);
9
  //
10
  //
11
  //
12
  canvas.dispose();
13
  ImageIO.write(image, "png", new File("test.png"));
14
}
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).

von Karl H. (kbuchegg)


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.


1
public static void generateImage() throws IOException {
2
  BufferedImage image = new BufferedImage(640, 480,
3
      BufferedImage.TYPE_INT_ARGB);
4
  
5
  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.

von Läubi .. (laeubi) Benutzerseite


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'

von ??? (Gast)


Lesenswert?

a) hier würde ich ImageMagick verwenden:
http://www.imagemagick.org/script/command-line-options.php#draw

b) wxWidgets
http://docs.wxwidgets.org/stable/wx_wxmemorydc.html#wxmemorydc
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.

von Tom E. (tkon)


Lesenswert?

.. und zum Abspeichern kannst das "SVG" Format verwenden.

von Μαtthias W. (matthias) Benutzerseite


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

von Weinga-Unity (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.