2016-09-27 3 views
0

Ich schreibe eine Anwendung in JavaFX, die Änderungen an einem Bild mit einem Klicken eines Knopfes macht. Also habe ich eine ImageView und ich muss das Bild daraus extrahieren, einige Änderungen übernehmen und zurückstellen. Wenn ich jedoch ein Bild zeige, das ich von ImageView erhalte, scheint es leer zu sein, nur schwarzer Bildschirm. Ich habe einen Testcode geschrieben, der das seltsame Verhalten darstellt.Kann Bild von ImageView in JavaFX nicht erhalten

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

Wenn ich die Anwendung ausführen, „Imageview“ -Display enthält Bild, das „Bild frm Imageview“ leer ist. Ich würde mich über Vorschläge freuen.

Antwort

1

Als Dokumentation von SwingFXUtils.fromFXImage sagt:

Der optionale Parameter BufferedImage wiederverwendet werden können, um die Kopie der Pixel zu speichern. Ein neues BufferedImage wird erstellt, wenn das mitgelieferte Objekt Null ist, zu klein oder von einem Typ ist, in den die Bildpixel nicht einfach konvertiert werden können.

In Ihrem Fall der Typ stimmt nicht mit dem einen SwingFXUtils.fromFXImage will verwenden. So wird ein neues BufferedImage erstellt und zurückgegeben, das die kopierten Pixel enthält, während Ihr BackImg unberührt bleibt. Sie müssen nicht einmal ein BufferedImage anbieten. Setzen Sie einfach das zweite Argument auf null:

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

einige weitere Informationen:

  • Sie die Variable backImg zweimal definiert haben. Entfernen Sie die erste Definition, weil sie unbenutzt und nicht verwendbar ist.
  • Sie können sogar Ihr Bild laden, indem Sie die JavaFXImage-Constructor mit

:

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

Dank für Ihre Antwort danken. Eigentlich gibt es einen Grund, warum ich das zweite Argument zur Verfügung stellte: Ich benutze BoofCV und wenn ich ein Bild ohne das zweite Argument und dann zu Planar umwandle, konvertiert es es mit der falschen Anzahl von Dimensionen. Hab keine Ahnung warum. Könnten Sie mir bitte einen Hinweis geben, warum ich hier einen Typenkonflikt habe? Auch Neudefinition von BackImg war ein Tippfehler, es hat keinen Einfluss auf das Ergebnis. –

+0

Scheint wie ich das Problem gefunden habe, aber es ist immer noch seltsam. Wenn ich zuerst 'SwingFXUtils.fromFXImage' und dann' SwingFXUtils.fromFXImage' starte, ändert sich der Typ von 5 zu 3. Ich weiß nicht, wie ich dagegen ankämpfen kann. –

+1

Es scheint, dass 'SwingFXUtils.fromFXImage' nur TYPE_INT_ARGB und TYPE_INT_ARGB_PRE akzeptiert. Wenn Ihr BufferedImage einen anderen Typ hat, wählt er eines der beiden aus. Das einzige, was Sie tun können, ist sicherzustellen, dass Sie eine der beiden Arten haben. – Zerlono