由于使用JavaFX编写了一个图像查看器,我实现了一个具有以下结构的图像库:
HBox - ScrollPane - VBox
这是基本结构,库对象构造如下:
StackPane - ImageView - 标签
因为setAlignment
没有ScrollPane
方法,所以我把整个事情放在HBox
中,即使我不需要它的其他功能。
这些方法负责库的生成和初始化:
private HBox createScrollableLibrary()
{
libraryContent = new VBox();
libraryContent.setPadding(new Insets(10));
libraryContent.setAlignment(Pos.CENTER);
libraryContent.setStyle("-fx-background-color: transparent");
libraryContent.setSpacing(10);
libraryScroll = new ScrollPane();
libraryScroll.setHbarPolicy(ScrollBarPolicy.NEVER);
libraryScroll.setStyle("-fx-background: rgb(0, 0, 0, 0.3);"
+ "-fx-background-color: rgb(0, 0, 0, 0.3);");
libraryScroll.setMinWidth(135);
libraryScroll.setMaxWidth(135);
libraryScroll.setContent(libraryContent);
HBox root = new HBox();
root.setPickOnBounds(false);
root.getChildren().add(libraryScroll);
return root;
}
和
public void initLibrary()
{
Runnable work = () ->
{
ObservableList<StackPane> previewList = FXCollections.observableArrayList();
ImageView preview;
Label label;
StackPane previewAndLabel;
for(int i = 0; i < picturePaths.size(); i++)
{
String path = picturePaths.get(i).toURI().toString();
preview = new ImageView(new Image(path));
preview.setPreserveRatio(true);
preview.setFitWidth(100);
//label = new Label(new File(path).getName());
label = new Label("IMAGE");
StackPane.setAlignment(label, Pos.CENTER_LEFT);
previewAndLabel = new StackPane();
previewAndLabel.getChildren().addAll(preview, label);
previewList.add(previewAndLabel);
}
Platform.runLater(() -> GUI.getLibraryContent().getChildren().addAll(previewList));
};
loading = new Thread(work);
if(loading.isAlive())
loading.interrupt();
loading.start();
}
信息:picturePaths
是一个ObservableList
,其中包含所有选定图片的路径,而这些路径又选择了FileChooser
。
现在我的问题:
我知道将大尺寸照片用作预览图像效率非常低。
即使我将堆空间增加到1GB,它也会减慢并在我添加更多图片时抛出java.lang.OutOfMemoryError
异常,我猜这个极限大约是20到25张大尺寸图片。
如何使用例如1920x1080到1024x720的分辨率“缩小”普通图像?或者是否还有机会让我的图书馆使用小而“快”的图像?我可以缓冲已经“计算”的图像以使我的图像查看器更快吗?
感谢任何提示和帮助。如果需要,请批评我的代码!
答案 0 :(得分:1)
可以尝试在Image构造函数中设置预览图片的大小限制,而不是之后。