2012-02-09 31 views
6

Cách xuất nội dung của biểu đồ Scene trong JavaFX 2 đến Image. Trên thực tế, tôi đang làm việc trên một ứng dụng, về cơ bản thiết kế thẻ. Vì vậy, người dùng chỉ cần nhấp vào các tùy chọn khác nhau để tùy chỉnh cảnh. Cuối cùng, tôi muốn xuất nội dung cảnh vào một tệp hình ảnh. Làm thế nào để làm điều đó ?Cách xuất nội dung của một Scenegraph trong JavaFX 2 sang một hình ảnh

Trả lời

9

Trong FX 2.2, tính năng chụp nhanh mới xuất hiện cho vấn đề đó. Bạn chỉ có thể nói

WritableImage snapshot = scene.snapshot(null); 

Với FX cũ hơn, bạn có thể sử dụng Robot AWT. Đây không phải là cách tiếp cận rất tốt vì nó đòi hỏi toàn bộ ngăn xếp AWT để bắt đầu.

  // 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

Tôi đã cập nhật câu trả lời do tính năng chụp nhanh FX 2.2 mới –

4

Cập nhật

JavaFX 2.2 (jdk7u6) thêm một Node snapshot to image tính năng đó sẽ là cách ưa thích của việc hoàn thành nhiệm vụ này.


Trước 2.2, JavaFX hiện không có chức năng công khai để chuyển đổi nút hoặc cảnh thành hình ảnh. Có một yêu cầu tính năng mở cho http://javafx-jira.kenai.com/browse/RT-13751 này (mọi người đều có thể đăng ký để xem trạng thái yêu cầu tính năng hiện tại).

Là một workaround trong khi chờ đợi, bạn có thể sử dụng Swing/chức năng AWT để chuyển đổi cảnh JavaFX để một hình ảnh và ghi ảnh kết quả vào một tập tin:

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

Đoạn mã trên được diễn giải từ: JavaFXDev: Screen capture tool .

Các sceneRect có thể được xác định bởi:

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

Nếu bạn làm theo các thành ngữ trên, hãy cẩn thận của luồng - chẳng hạn rằng mã truy cập vào cảnh JavaFX sống chỉ chạy trên các Chủ đề JavaFX Application và mã AWT chỉ chạy trên chuỗi AWT.

+1

Có vẻ như Sergey đã đăng giải pháp khi tôi viết câu trả lời của tôi - có vẻ như hai giải pháp khá giống nhau ;-) Tôi sẽ để lại câu trả lời trùng lặp của mình nó chứa một vài liên kết hữu ích. – jewelsea

Các vấn đề liên quan