我正在JavaFX中编写一个应用程序,只需点击一下按钮即可修改图片。所以我有一个ImageView,我必须从中提取图像,应用一些更改并将其设置回来。但是,当我显示我从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"屏幕包含图像,其中"图像frm ImageView"是空白的。 我很感激任何建议。
答案 0 :(得分:1)
正如SwingFXUtils.fromFXImage的文档所说:
可以重复使用可选的BufferedImage参数来存储副本 像素。如果提供的话,将创建一个新的BufferedImage object为null,太小或者是图像像素的类型 不能轻易转换成。
在你的情况下,与SwingFXUtils.fromFXImage的类型不匹配想要使用。因此,将创建并返回一个新的BufferedImage,其中包含复制的像素,而backImg保持不变。 你甚至不必提供BufferedImage。只需将第二个参数设置为null:
BufferedImage backImg = SwingFXUtils.fromFXImage(imageView.getImage(), null);
更多信息:
Image fxFromFile = new Image(Corrector.class.getResourceAsStream("/image.png"));