Имейте в виду, я не могу найти никаких документов, подтверждающих то, что я говорю. Это только из прошлого опыта.

аюсь позволить пользователю загружать изображения с жесткого диска и визуально представлять их в графическом интерфейсе в виде списка миниатюр (JPanels с иконками, добавленными в JList). В настоящее время я использую ImageIO.read (), чтобы получить BufferedImage, и использую getScaledInstance для каждого изображения (слышал, что вы не должны использовать это, хотя).

Он работает достаточно хорошо с небольшими изображениями, но загружает более четырех фотографий (5000x3000 или около того), и я получаю «java.lang.OutOfMemoryError: Java heap space». Ссылка на полный размер BufferedImage не сохраняется, поэтому я решил, что сборщик мусора избавится от него и сохранит только масштабированное изображение (которое не должно занимать много памяти), но это не похоже на это. Я протоптал getRuntime (). Gc () и System.gc (), но безрезультатно.

Любой хороший способ загрузки масштабированных изображений из файла, без ошибок памяти? Очевидно, что многим программным продуктам удается делать именно это, хотя, может быть, и не в Java. Внешние библиотеки в порядке.

Текущий код:

BufferedImage unscaledImage = ImageIO.read(imageFile);

int unscaledHeight = unscaledImage.getHeight();
int unscaledWidth = unscaledImage.getWidth();

int imageRatio = unscaledHeight/unscaledWidth;

if (imageRatio >= 1) {
    return new ImageIcon(unscaledImage.getScaledInstance(width,-1,Image.SCALE_FAST));
} else {
    return new ImageIcon(unscaledImage.getScaledInstance(-1,height,Image.SCALE_FAST));
}

Ответы на вопрос(2)

Ваш ответ на вопрос