2012-02-09 18 views
6

Sceneグラフの内容をJavaFX 2でImageに出力する方法。実際には、私は基本的にカードをデザインするアプリに取り組んでいます。そのため、ユーザーはさまざまなオプションをクリックしてシーンをカスタマイズします。最後に、シーンコンテンツをImageファイルに書き出したいと思います。それ、どうやったら出来るの ?JavaFX 2のScenegraphの内容をイメージに出力する方法

答えて

9

FX 2.2では、新しいスナップショット機能が登場しました。あなたはちょうどあなたがAWTロボットを使用することができ、古いFXで

WritableImage snapshot = scene.snapshot(null); 

を言うことができます。 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); 
+0

私は新しいFX 2.2スナップショット機能のために答えを更新しました –

4

更新

のJavaFX 2.2(jdk7u6)は、このタスクを達成するための好適な方法であろうノードsnapshot to image機能を追加しました。


2.2より前のバージョンでは、JavaFXには現在、ノードまたはシーンをイメージに変換するパブリック関数がありません。このhttp://javafx-jira.kenai.com/browse/RT-13751の未処理機能要求があります(誰でも現在の機能要求ステータスを表示するためにサインアップできます)。

その間に回避策として、あなたがイメージにJavaFXのシーンを変換し、ファイルへの結果の画像を書き込むためのSwing/AWT機能を使用することができますが:

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

上記のコードをから言い換えている:JavaFXDev: Screen capture tool

sceneRectをすることによって決定することができる:あなたは上記のイディオムに従った場合は、スレッドの注意が必要

Stage stage = (Stage) scene.getWindow(); 
stage.toFront(); 
Rectangle sceneRect = new Rectangle(
    stage.getX() + scene.getX(), stage.getY() + scene.getY(), 
    scene.getWidth(), scene.getHeight()); 

- ライブのJavaFXシーンにアクセスするコードのみが唯一のJavaFXアプリケーションスレッドとAWTのコード上で動作するようにAWTスレッドで実行されます。

+1

セルゲイはすでに私の答えを書いていたのですが、2つの解決策はかなり似ているようです-----私はそれは役に立つリンクをいくつか含んでいます。 – jewelsea

関連する問題