Я пытаюсь позволить пользователю загружать изображения со своего жесткого диска и визуально представлять их в графическом интерфейсе в виде списка миниатюр (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));
}