如何将图像文件加载到 ImageView?

Posted

技术标签:

【中文标题】如何将图像文件加载到 ImageView?【英文标题】:How to load Image file to ImageView? 【发布时间】:2017-02-28 10:18:06 【问题描述】:

我试图从文件选择器中选择图像文件后立即显示它。文件选择器仅限于 .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...");
        
    

【问题讨论】:

【参考方案1】:

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

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;
    
 

【讨论】:

【参考方案2】:

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

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 了解其他可用的构造函数。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于如何将图像文件加载到 ImageView?的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何在不加载完整位图的情况下将流式图像即时渲染到 ImageView?

如何使用 Glide 将 svg 图像加载到图像视图

Android - 将 ImageView 保存到具有全分辨率图像的文件

通过从 FilePath 获取图像将图像加载到 ImageView

使用 AsyncImageView 将图像加载到 ImageView 宽度

iPhone将图像从imageview存储到文件