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 | 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).
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.
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'
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.
.. und zum Abspeichern kannst das "SVG" Format verwenden.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.