2012-02-09 6 views
6

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

9

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); 
+0

He actualizado una respuesta debido a la nueva función de captura de FX 2.2 –

4

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.

+1

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

Cuestiones relacionadas