2012-02-09 2 views
6

Scene 그래프의 내용을 JavaFX 2에서 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

업데이트

자바 FX 2.2 (jdk7u6)이 작업을 달성 선호하는 방법이 될 것이다 노드 snapshot to image 기능을 추가했습니다.


2.2 이전에는 JavaFX에 현재 노드 또는 장면을 이미지로 변환하는 공용 기능이 없습니다. 이 http://javafx-jira.kenai.com/browse/RT-13751에 대한 공개 기능 요청이 있습니다 (누구든지 현재 기능 요청 상태를 보려면 가입 할 수 있음). 그 동안 해결 방법으로

, 당신은 이미지에 자바 FX 장면을 변환 스윙/AWT 기능을 사용하여 파일에 결과 이미지를 작성할 수 JavaFXDev: Screen capture tool : 위의 코드에서 부연되는

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

.

sceneRect에 의해 결정될 수있다 위의 관용구를 수행하면

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

는 스레딩의주의 - 코드에 액세스하는 라이브 자바 FX 장면 만 자바 FX 애플리케이션 스레드와 AWT 코드를 실행하도록 만 AWT 스레드에서 실행됩니다.

+1

세르게이가 이미 내 답변을 쓰는 ​​동안 보이는 것처럼 보입니다 - 두 가지 해결책이 꽤 비슷합니다 ;-) 나는 내 중복 답변을 다음과 같이 남겨 둘 것입니다. 여기에는 몇 가지 유용한 링크가 포함되어 있습니다. – jewelsea

관련 문제