JavaFX - Slim图像以防止堆空间过载?

时间:2016-10-13 12:59:19

标签: javafx imageview heap-memory

Image library on the left side 由于使用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的分辨率“缩小”普通图像?或者是否还有机会让我的图书馆使用小而“快”的图像?我可以缓冲已经“计算”的图像以使我的图像查看器更快吗?

感谢任何提示和帮助。如果需要,请批评我的代码!

1 个答案:

答案 0 :(得分:1)

可以尝试在Image构造函数中设置预览图片的大小限制,而不是之后。