【问题标题】:Can't get Image from ImageView in JavaFX无法从 JavaFX 中的 ImageView 获取图像
【发布时间】:2025-12-15 19:30:01
【问题描述】:

我正在用 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”屏幕包含图像,其中“Image frm ImageView”为空白。 如有任何建议,我将不胜感激。

【问题讨论】:

    标签: javafx


    【解决方案1】:

    正如 SwingFXUtils.fromFXImage 的文档所说:

    可选的 BufferedImage 参数可以重复使用来存储副本 的像素。如果提供的,将创建一个新的 BufferedImage 对象为空、太小或图像像素的类型 不容易转换成。

    在您的情况下,类型与 SwingFXUtils.fromFXImage 想要使用的类型不匹配。因此,将创建并返回一个新的 BufferedImage,其中包含复制的像素,而您的 backImg 保持不变。 您甚至不必提供 BufferedImage。只需将第二个参数设置为 null:

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

    更多信息:

    • 您已经定义了变量 backImg 两次。删除第一个定义,因为它未使用且无法使用。
    • 您甚至可以使用 JavaFXImage-Constructor 加载图像

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

    【讨论】:

    • 感谢您的回答。实际上,我提供第二个参数是有原因的:我使用的是 BoofCV,当我将没有第二个参数的图像转换为 Planar 时,它会以错误的维数进行转换。不知道为什么。那么您能否给我一个提示,为什么我在这里有类型不匹配? backImg 的重新定义也是一个错字,它不影响结果。
    • 好像发现了问题,但还是很奇怪。当我先跑SwingFXUtils.fromFXImage再跑SwingFXUtils.fromFXImage时,类型从5变成了3,不知道怎么打。
    • 看来SwingFXUtils.fromFXImage只接受TYPE_INT_ARGB和TYPE_INT_ARGB_PRE。如果您的 BufferedImage 具有不同的类型,它将选择两者之一。您唯一能做的就是确保拥有这两种类型中的一种。
    最近更新 更多