Cómo generar el contenido de un gráfico Scene
en JavaFX 2 en un Image
. En realidad, estoy trabajando en una aplicación, que básicamente diseña tarjetas. Entonces, el usuario simplemente hace clic en las diversas opciones para personalizar la escena. Finalmente, me gustaría exportar el contenido de la escena a un archivo de imagen. Cómo puedo hacer eso ?Cómo generar el contenido de un Scenegraph en JavaFX 2 en una imagen
Respuesta
En FX 2.2 apareció una nueva función de instantánea para ese asunto. Se puede decir simplemente
WritableImage snapshot = scene.snapshot(null);
Con FX mayores puede utilizar Robot AWT. Este enfoque no es muy bueno ya que requiere una pila AWT completa para comenzar.
// 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);
actualización
JavaFX 2,2 (jdk7u6) añadieron una característica Nodo snapshot to image que sería la forma preferida de realizar esta tarea.
Antes de 2.2, JavaFX actualmente no tiene una función pública para convertir un nodo o escena a una imagen. Hay una solicitud de función abierta para este http://javafx-jira.kenai.com/browse/RT-13751 (cualquiera puede registrarse para ver el estado actual de la solicitud de función).
Como solución, mientras tanto, se puede utilizar las funciones de Swing/AWT para convertir la escena JavaFX a una imagen y escribir la imagen resultante en un archivo:
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);
El código anterior se parafrasea a partir de: JavaFXDev: Screen capture tool .
El sceneRect puede ser determinada por:
Stage stage = (Stage) scene.getWindow();
stage.toFront();
Rectangle sceneRect = new Rectangle(
stage.getX() + scene.getX(), stage.getY() + scene.getY(),
scene.getWidth(), scene.getHeight());
Si sigue el lenguaje anterior, tenga cuidado de rosca - tal que el código para acceder a la escena JavaFX en vivo sólo se ejecuta en el subproceso de la aplicación JavaFX y el código de AWT solamente se ejecuta en el subproceso AWT.
Parece que Sergey ya publicó una solución mientras escribía mi respuesta, parece que las dos soluciones son bastante similares ;-) Dejaré mi respuesta duplicada como contiene un par de enlaces útiles. – jewelsea
- 1. forma correcta de mover un nodo arrastrando en javafx 2?
- 2. Cómo convertir un nodo a una imagen en javafx 2.1?
- 3. Localización JavaFX 2.x TableView
- 4. ¿Cómo acercas un nodo JavaFX 2 Canvas?
- 5. ¿Cómo probar JavaFX 2 en un entorno sin cabeza?
- 6. Extraños anchos de control en JavaFX 2?
- 7. JavaFX 2 como una dependencia de Maven
- 8. ¿Por qué desaparece el contenido de JavaFX en mi TopComponent?
- 9. JavaFX 2 de depuración css
- 10. Cómo generar sombra debajo de las palabras en una imagen
- 11. JavaFX: incrustación de imagen codificada en el archivo .FXML
- 12. ¿Cómo se anima el mensaje de pantalla completa JavaFX 2?
- 13. Cómo realizar una acción seleccionando un elemento de ListView en JavaFX 2
- 14. JavaFX-2 - establecer varios estilos
- 15. Cómo generar un video en blanco de 2 horas
- 16. Rendimiento de dibujo de JavaFX 2
- 17. generando un MouseEvent en JavaFX
- 18. Generar una imagen enorme en C#
- 19. Par de valores clave combinados en JavaFX 2
- 20. Cómo envolver un componente Swing en una aplicación JavaFX 2.0
- 21. cómo generar una imagen de este tipo en Mathematica
- 22. JavaFX emergente del panel de 2 personalizada
- 23. Marco de prueba GUI para JavaFX 2
- 24. ¿Cómo generar una imagen completamente aleatoria?
- 25. Javafx: Reordenar una columna en un TableView
- 26. ¿Cómo puedo generar una imagen en Ruby sin dependencias externas?
- 27. ¿Cómo crear una pantalla de carga personalizada en JavaFX?
- 28. Obtener la dimensión de un nodo - JavaFX 2
- 29. ¿Cómo hacer una superposición sobre la vista web de JavaFX 2?
- 30. Javafx 2 TreeView - ocultar elemento raíz
He actualizado una respuesta debido a la nueva función de captura de FX 2.2 –