2016-09-27 101 views
0

我正在用JavaFX編寫一個應用程序,該程序通過單擊按鈕來修改圖片。所以我有一個ImageView,我必須從中提取圖像,應用一些更改並將其設置回來。但是,當我顯示從ImageView中獲得的圖像時,它看起來是空白的,只是黑屏。 我寫了一些測試代碼,代表那種奇怪的行爲。無法從JavaFX中的ImageView中獲取圖像

public class Corrector extends Application { 
    @Override 
    public void start(Stage stage) { 
     try { 
      javafx.scene.image.ImageView imageView = new ImageView(); 

      BufferedImage a = ImageIO.read(ClassLoader.getSystemResource("/image.jpg")); 
      javafx.scene.image.Image image = SwingFXUtils.toFXImage(a, null); 
      imageView.setImage(image); 
      BufferedImage backImg = new BufferedImage(a.getWidth(), a.getHeight(), a.getType()); 
      SwingFXUtils.fromFXImage(imageView.getImage(), backImg); 
      ShowImages.showWindow(backImg, "Image from imageVIew", true); 

      stage.setTitle("ImageView"); 
      stage.setWidth(1000); 
      stage.setHeight(500); 
      Scene scene = new Scene(new Group()); 
      VBox root = new VBox(); 

      root.getChildren().addAll(imageView); 

      scene.setRoot(root); 

      stage.setScene(scene); 
      stage.show(); 
     } catch (Exception e) { 
      System.out.printf(e.getMessage()); 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

當我運行該應用程序時,「ImageView」屏幕包含圖像,其中「Image frm ImageView」爲空。 我將不勝感激任何建議。

回答

1

由於SwingFXUtils.fromFXImage的文件說:

可選的BufferedImage參數可以被重複使用來存儲像素的副本 。如果所提供的 對象爲空,太小或者圖像像素 無法輕易轉換成的類型,則會創建一個新的BufferedImage。

在你的情況下,類型與SwingFXUtils.fromFXImage不匹配想要使用。因此,一個新的BufferedImage將被創建並返回,包含複製的像素,而您的backImg保持不動。 你甚至不必提供BufferedImage。就在第二個參數設置爲null:

BufferedImage backImg = SwingFXUtils.fromFXImage(imageView.getImage(), null); 

一些詳細信息:

  • 您曾兩次定義的變量backImg。刪除第一個定義,因爲它未被使用且不可用。
  • 你甚至可以通過使用JavaFXImage構造函數

載入圖片:

Image fxFromFile = new Image(Corrector.class.getResourceAsStream("/image.png")); 
+0

謝謝您的回答。實際上,我提供第二個參數是有原因的:我使用的是BoofCV,當我轉換一個沒有第二個參數的圖像,然後轉換爲Planar 時,它會用錯誤的維數轉換它。不知道爲什麼。 所以你可以給我一個提示,爲什麼我在這裏有一個類型不匹配? 也是重新定義backImg是一個錯字,它不會影響結果。 –

+0

似乎我發現了這個問題,但它仍然很奇怪。當我第一次運行'SwingFXUtils.fromFXImage',然後運行'SwingFXUtils.fromFXImage'時,類型從5改變爲3.我不知道如何與之對抗。 –

+1

看起來'SwingFXUtils.fromFXImage'只接受TYPE_INT_ARGB和TYPE_INT_ARGB_PRE。如果你的BufferedImage具有不同的類型,它將選擇其中的一個。你唯一能做的就是確保有兩種類型之一。 – Zerlono