# Screenshot einer Graphics2D Anwendung erstellen



## haimat (28. Mrz 2010)

Hallo und guten Abend zusammen!

Ich entwickle gerade eine Simulation inkl. grafischer Ausgabe, die via Graphics2D im fullscreen Modues eines GraphicsDevice auf den Bildschirm zeichnet. Das funktioniert auch ganz gut, nun möchte ich per Tastendruck einen Screenshot der kompletten Ausgabe erstellen.

Ich habe ein bischen im Internet gegoogelt, stosse dabei immer wieder auf die Robot-Klasse, die aber anscheined bei einer grafischen Ausgabe nicht funktioniert (das gespeicherte Bild ist in meinem Fall immer nur grau). Kennt wer von euch eine Möglichkeit, den Bildschirminhalt einer solchen Graphics2D basierten Applikation in ein File zu schreiben?

Bin für jeden Hinweis dankbar 

Schönen Abend noch und viele Grüße, Matthias


----------



## eRaaaa (28. Mrz 2010)

haimat hat gesagt.:


> Ich habe ein bischen im Internet gegoogelt, stosse dabei immer wieder auf die Robot-Klasse, die aber anscheined bei einer grafischen Ausgabe nicht funktioniert (das gespeicherte Bild ist in meinem Fall immer nur grau).



Mhmm .. hat der vllt das falsche GraphicsDevice benutzt? Man kann dem Robot im Konstruktor das Device mitgeben, oder hattest du das getan und klappt trotzdem nicht?
Bzw könntest du mal ein KSKB posten?


----------



## haimat (28. Mrz 2010)

Hallo Basti,

der Tipp mit dem Angeben des devices war gut, das habe ich noch gar nicht gesehen. Leider bleibt auch bei der Angabe meines devices das Bild grau. Anbei mal meine screenshot Methode:


```
public void takeScreenshot(String loc) throws IOException, AWTException
	{
		File file = new File(loc);
		Robot robot = new Robot(device);
		
		BufferedImage screenShot = robot.createScreenCapture(
				new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
		ImageIO.write(screenShot, "PNG", file);
	}
```

Reicht das für eine Analyse, oder bedarf es wirklich eines vollwertigen kompilierbaren Bsp.? Wenn ja, dann dauert das etwas, denn die graphische Ausgabe besteht aus ein ein paar zugrundeliegenden Hilfs-Klassen, die ich erst mal extrahieren muss...

Danke und viele Grüße, Matthias


----------



## Steev (28. Mrz 2010)

Hmm, ich frage mich gerade, wieso du die Robots-Klasse verwendest, wenn du doch über ein VolatileImage rendern könntest und dieses dann ganz unkompliziert in ein BufferedImage zeichnen könntest. Das BufferedImage könntest du dann über ImageIO abspeichern.
Wenn du in ein VolatileImage renderst, dann muss du das Bild einfach nur noch per drawImage auf den Bildschirm zeichnen.
Schneller ist das ganze in der Regel sogar auch noch.

Gruß
Steev


----------



## haimat (29. Mrz 2010)

Hallo Steev,

danke für den Tipp! Ich kenne diese Konzept noch nicht, daher noch eine Frage: meinst du, dass ich anstatt direkt in das Graphics2D Objekt zu zeichnen stattdessen in ein VolatileImage zeichne und das Ganze dann via Graphics2D rendere? Wenn ja, ist es dann möglich die BufferStrategies etc. wie gewohnt zu verwenden?

Thx und lg, Matthias


----------



## Steev (29. Mrz 2010)

Guten Morgen,

du kannst von einem VolatileImage ebenfalls ein Graphics2D-Objekt zurückbekommen und so zeichnen. Die Zeichnung auf das JFrame oder auf dein JPanel erfolgt weiterhin über das Graphics(2D)-Objekt der paint(Component)-Methode. Nur das du halt nur noch drawImage(deinVolatileImage, 0, 0, null) aufrufst, anstatt, wie bisher, alle deine Objekte über dieses Graphics(2D)-Objekt zu rendern.
Intern rufst du natürlich noch in regelmäßigen Abständen (evtl. bei jedem Aufruf der paint(Component)-Methode) eine Methode auf, die das VolatileImage neu zeichnet.

Daher wird alles andere so bleiben können wie bisher, nur dass du die Zeichnung der Objekte um eine Methode "verschoben" wird.

Gruß
Steev


----------



## haimat (29. Mrz 2010)

Wunderbar, das ist natürlich genau das, was ich gesucht habe!
Vielen Dank, ich werd mir das heute Abend gleich ansehen...

Viele Grüße, Matthias


----------

