如何将图像文件加载到ImageView?
How to load Image file to ImageView?
我试图在从文件选择器中选择图像文件后立即显示它。文件选择器仅限于 .png 和 .jpg 文件,所选文件存储在文件类型的变量中。为此,我设置了一个 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...");
}
}
您创建图像并设置为 ImageView
如下
Image image = new Image(new FileInputStream(selectedFile));
previewPicture.setImage(image);
您只需使用
创建图像
Image image = new Image(selectedFile.toURI().toString());
然后放在ImageView
:
previewPicture.setImage(image);
其他构造函数可以更好地控制加载图像所需的资源。如果你想强制图像为特定大小,你可以在加载时调整它的大小,如果用户选择大图像但你只想显示缩小版本,这将节省内存。此外,加载大图像可能需要时间,因此您不应在 UI 线程上加载它。 Image
构造函数采用 URL 的字符串版本,可以选择在后台线程中自动加载图像。下面强制宽度和高度不超过 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。
我添加了一个迟到的答案来演示不同的图像文件加载备选方案:
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;
}
}
我试图在从文件选择器中选择图像文件后立即显示它。文件选择器仅限于 .png 和 .jpg 文件,所选文件存储在文件类型的变量中。为此,我设置了一个 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...");
}
}
您创建图像并设置为 ImageView
如下
Image image = new Image(new FileInputStream(selectedFile));
previewPicture.setImage(image);
您只需使用
创建图像Image image = new Image(selectedFile.toURI().toString());
然后放在ImageView
:
previewPicture.setImage(image);
其他构造函数可以更好地控制加载图像所需的资源。如果你想强制图像为特定大小,你可以在加载时调整它的大小,如果用户选择大图像但你只想显示缩小版本,这将节省内存。此外,加载大图像可能需要时间,因此您不应在 UI 线程上加载它。 Image
构造函数采用 URL 的字符串版本,可以选择在后台线程中自动加载图像。下面强制宽度和高度不超过 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。
我添加了一个迟到的答案来演示不同的图像文件加载备选方案:
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;
}
}