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

6

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

如何实现这一点?目前的代码如下...

    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...");
        }
    }
3个回答

9

您可以使用以下步骤创建图像:

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

查看文档以获取其他可用的构造函数。


2
您可以按照以下步骤创建图像并将其设置为ImageView
  Image image = new Image(new FileInputStream(selectedFile));
  previewPicture.setImage(image);

0
我添加了一个晚回答来演示不同的图像文件加载替代方案:
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;
    }
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接