2012-09-08 11 views
6

私はJava FXを使用しています。ノードをイメージに変換したいと思います。私はこのリソースを見つけましたが、ノード全体をイメージではなく、ノードに変換したいので、私の問題は解決しません。javafx 2.1でノードをイメージに変換するには?

How to output the content of a Scene graph in JavaFx 2.0 to an Image

+0

私はこのことについてよく分かりませんし、テストする時間はありませんが、新しいシーンを作成し、イメージに変換するノードをソールとして追加することはできません子どもは、リンクで説明されている方法を使用して?私は、あなたが作成する2番目のシーンを表示する必要がないと思います。 –

答えて

5

これは私の問題の解決です。この解決策はSergeyとjewelseaの助けです。この解決策はjavafx 2.2にあります。 Sergeyとjewelseaに感謝します。

public class TrySnapshot extends Application { 

javafx.embed.swing.SwingFXUtils fXUtils; 
BufferedImage bufferedImage = new BufferedImage(550, 400, BufferedImage.TYPE_INT_ARGB); 
File file = new File("C:/Users/PC1/Desktop/Sample Images/test.jpg"); 
VBox vbox = null; 

@Override 
public void start(Stage primaryStage) { 
    vbox = new VBox(); 
    Button btn = new Button(); 
    Image i = new Image("file:C:\\Koala.jpg"); 
    ImageView imageView = new ImageView(); 
    imageView.setImage(i); 
    vbox.getChildren().add(imageView); 
    vbox.setSpacing(10); 
    btn.setText("Say 'Hello World'"); 
    btn.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
     // here we make image from vbox and add it to scene, can be repeated :) 
     WritableImage snapshot = vbox.snapshot(new SnapshotParameters(), null); 
      vbox.getChildren().add(new ImageView(snapshot)); 
      saveImage(snapshot); 
      System.out.println(vbox.getChildren().size()); 
     } 
    }); 


    Scene scene = new Scene(new Group(btn), 500, 400); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

private void saveImage(WritableImage snapshot) { 
    BufferedImage image; 
    image = javafx.embed.swing.SwingFXUtils.fromFXImage(snapshot, bufferedImage); 
    try { 
     Graphics2D gd = (Graphics2D) image.getGraphics(); 
     gd.translate(vbox.getWidth(), vbox.getHeight()); 
     ImageIO.write(image, "png", file); 
    } catch (IOException ex) { 
     Logger.getLogger(TrySnapshot.class.getName()).log(Level.SEVERE, null, ex); 
    }; 
    } 
} 
+0

この回答を正しいものとしてマークし、このトピックをクリーンアップするために「This is my code」を削除してください。 –

+0

ok Sergey。私は "This is my code"を削除します。今これは明確な話題です。 –

+0

どうもありがとう! –

11

新しいFX 2.2スナップショット機能を使用することができます:あなたが何らかの理由で古いFXを使用する必要がある場合だけでシーンを変更

public class TrySnapshot extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     final VBox vbox = new VBox(2); 
     final Button btn = new Button(); 
     vbox.getChildren().add(btn); 
     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       // here we make image from vbox and add it to scene, can be repeated :) 
       WritableImage snapshot = vbox.snapshot(new SnapshotParameters(), null); 

       vbox.getChildren().add(new ImageView(snapshot)); 
       System.out.println(vbox.getChildren().size()); 
      } 
     }); 

     Scene scene = new Scene(new Group(vbox), 300, 250); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

の中Node#getBoundsInParent呼び出しを使用してノードの座標に座標リンクしたサンプルコード。

+0

セルゲイに感謝します。しかし、snaphot()メソッドは私の問題の解決策ではありません。私はバッファリングされたイメージをいくつかしたい。 –

+2

Sergeyのソリューションと[SwingFXUtils](http://docs.oracle.com/javafx/2/api/javafx/embed/swing/SwingFXUtils.html#fromFXImage(javafx.scene.image))を使用して、awtによるビュート画像を取得できます。 Image、%20java.awt.image.BufferedImage)) – jewelsea

関連する問題