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
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
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.
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.
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).
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
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
publicstaticvoidgenerateImage()throwsIOException{
2
BufferedImageimage=newBufferedImage(640,480,
3
BufferedImage.TYPE_INT_ARGB);
4
5
Graphics2Dcanvas=(Graphics2D)image.getGraphics();
6
canvas.setColor(newColor(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",newFile("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).
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
publicstaticvoidgenerateImage()throwsIOException{
2
BufferedImageimage=newBufferedImage(640,480,
3
BufferedImage.TYPE_INT_ARGB);
4
5
Graphics2Dcanvas=(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.
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'
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
@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