Come stampare il contenuto di un grafico Scene
in JavaFX 2 in un Image
. In realtà, sto lavorando a un'app, che fondamentalmente progetta le carte. Quindi, l'utente fa semplicemente clic sulle varie opzioni per personalizzare la scena. Infine, vorrei esportare il contenuto della scena in un file immagine. Come lo faccio ?Come stampare il contenuto di un Scenegraph in JavaFX 2 in un'immagine
risposta
In FX 2.2 è stata visualizzata una nuova funzione di istantanea. Si può solo dire che
WritableImage snapshot = scene.snapshot(null);
Con FX più vecchio è possibile utilizzare robot AWT. Questo approccio non è molto buono in quanto richiede l'avvio di un intero stack AWT.
// getting screen coordinates of a node (or whole scene)
Bounds b = node.getBoundsInParent();
int x = (int)Math.round(primaryStage.getX() + scene.getX() + b.getMinX());
int y = (int)Math.round(primaryStage.getY() + scene.getY() + b.getMinY());
int w = (int)Math.round(b.getWidth());
int h = (int)Math.round(b.getHeight());
// using ATW robot to get image
java.awt.Robot robot = new java.awt.Robot();
java.awt.image.BufferedImage bi = robot.createScreenCapture(new java.awt.Rectangle(x, y, w, h));
// convert BufferedImage to javafx.scene.image.Image
java.io.ByteArrayOutputStream stream = new java.io.ByteArrayOutputStream();
// or you can write directly to file instead
ImageIO.write(bi, "png", stream);
Image image = new Image(new java.io.ByteArrayInputStream(stream.toByteArray()), w, h, true, true);
Aggiorna
JavaFX 2.2 (jdk7u6) aggiunto un nodo snapshot to image caratteristica che sarebbe il modo preferito di realizzare questo compito.
Prima di 2.2, JavaFX al momento non dispone di una funzione pubblica per convertire un nodo o una scena in un'immagine. C'è una richiesta di funzionalità aperta per questo http://javafx-jira.kenai.com/browse/RT-13751 (chiunque può registrarsi per visualizzare lo stato della richiesta di funzionalità corrente).
Per aggirare il problema, nel frattempo, è possibile utilizzare le funzioni di Swing/AWT per convertire la scena JavaFX per un'immagine e scrivere l'immagine risultante in un file:
BufferedImage img = new Robot().createScreenCapture(
new java.awt.Rectangle(
(int)sceneRect.getX(), (int)sceneRect.getY(),
(int)sceneRect.getWidth()-1, (int)sceneRect.getHeight()-1));
File file = File.createTempFile("card", ".jpg");
ImageIO.write(img, "jpg", file);
Il codice di cui sopra è parafrasato da: JavaFXDev: Screen capture tool .
Lo sceneRect può essere determinata da:
Stage stage = (Stage) scene.getWindow();
stage.toFront();
Rectangle sceneRect = new Rectangle(
stage.getX() + scene.getX(), stage.getY() + scene.getY(),
scene.getWidth(), scene.getHeight());
Se si segue l'idioma di cui sopra, fare attenzione threading - in modo tale che il codice l'accesso alla scena live JavaFX gira solo sul filo JavaFX Application e il codice AWT unica funziona sul thread AWT.
Sembra che Sergey abbia già pubblicato una soluzione mentre stavo scrivendo la mia risposta - sembra che le due soluzioni siano abbastanza simili ;-) Lascerò la mia risposta duplicata come contiene un paio di link utili. – jewelsea
Ho aggiornato una risposta a causa della nuova funzione di istantanea FX 2.2 –