【问题标题】:How to load Image file to ImageView?如何将图像文件加载到 ImageView?
【发布时间】:2020-09-02 19:51:19
【问题描述】:

我试图从文件选择器中选择图像文件后立即显示它。文件选择器仅限于 .png 和 .jpg 文件,所选文件存储在 File 类型的变量中。为此,我设置了一个 ImageView,我希望使用这个新文件设置图像,唯一的问题是它的类型是文件而不是图像。

如何做到这一点?到目前为止的代码......

    public void fileSelection(){

        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Select Profile Picture");
        fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Image Files", "*.png", "*jpg"));
        File selectedFile = fileChooser.showOpenDialog(null);
        File selectedFileInput = selectedFile;

        if(selectedFile != null) {
            selectedFileOutput.setText("File selected: " + selectedFile.getName());
            previewPicture.setImage();
        } else {
            selectedFileOutput.setText("Please select a profile picture...");
        }
    }

【问题讨论】:

    标签: java image javafx imageview filechooser


    【解决方案1】:

    你可以简单地创建一个图像

    Image image = new Image(selectedFile.toURI().toString());
    

    然后放到ImageView:

    previewPicture.setImage(image);
    

    其他构造函数可以更好地控制加载图像所需的资源。如果你想强制图像为一定大小,你可以在加载时调整它的大小,如果用户选择大图像但你只想显示一个缩小的版本,这将节省内存。此外,加载大图像可能需要一些时间,因此您不应在 UI 线程上加载它。采用字符串版本的 URL 的 Image 构造函数具有在后台线程中自动加载图像的选项。以下强制宽度和高度都不超过 240 像素(同时保持原始纵横比),并将图像加载到背景中(因此不会阻塞 UI):

    Image image = new Image(selectedFile.toURI().toString(),
        240, // requested width
        240, // requested height
        true, // preserve ratio
        true, // smooth rescaling
        true // load in background
    );
    

    请参阅documentation 了解其他可用的构造函数。

    【讨论】:

      【解决方案2】:

      您创建图像并设置为ImageView,如下所示

        Image image = new Image(new FileInputStream(selectedFile));
        previewPicture.setImage(image);
      

      【讨论】:

        【解决方案3】:

        我添加了一个较晚的答案来演示不同的图像文件加载选项:

        import java.io.File;
        import java.net.URL;
        import javafx.application.Application;
        import javafx.scene.Scene;
        import javafx.scene.image.Image;
        import javafx.scene.image.ImageView;
        import javafx.scene.layout.Pane;
        import javafx.scene.layout.TilePane;
        import javafx.stage.Stage;
        
        public class ImagesFromFile extends Application {
        
            @Override
            public void start(Stage primaryStage) throws Exception{
                primaryStage.setTitle("Load Images From File");
                primaryStage.setScene(new Scene(new ImagePanel().getPane()));
                primaryStage.show();
            }
        
            public static void main(final String[] args) {
                launch(args);
            }
        }
        
        /**
        <pre>
        Folders structure:
        
           -Project
            | - src
            |   | - package
            |   |       | - ImagePanel.java
            |   |       | - red_dot.png
            |   |
            |   | - resources
            |           | - blue_dot.png
            |
            | - black_dot.png
         </pre>
        */
        
        class ImagePanel{
        
            private Pane pane;
        
            ImagePanel() {
        
                try{
        
                    //not embedded resource. doesn't work when packaged in jar
                    File file = new File("black_dot.png");
                    Image imageFromProjectFolder = new Image(file.toURI().toString());//or new Image(new FileInputStream("black_dot.png"));
                    ImageView view1 = new ImageView(imageFromProjectFolder);
        
                    URL url = getClass().getResource("red_dot.png");
                    Image imageFromSourceFolder =  new Image(url.openStream());
                    ImageView view2 = new ImageView(imageFromSourceFolder); //or new ImageView("/package/red_dot.png");
        
                    url = getClass().getResource("/resources/blue_dot.png");
                    Image imageFromReourceFolder = new Image(url.openStream());
                    ImageView view3 = new ImageView(imageFromReourceFolder); //or new ImageView("/resources/blue_dot.png");
        
                    pane = new TilePane(view1, view2, view3);
        
                } catch (Exception ex) {ex.printStackTrace();}
            }
        
            Pane getPane(){
                return pane;
            }
        } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-09
          • 2012-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多